IOException 및 ClassNotFoundException 과 같은 예외를 확인하기 위해 Spring Web Applications를 개발할 때, 컴파일러는 종종 프로그래머가 명시 적 캡처에 try-catch 사용하도록하려고합니다. ClassCastException 및 NullPointerException 과 같은 비 점점 예외의 경우 컴파일러가 프롬프트하지 않으며 이는 종종 프로그래머의 코드 쓰기 능력을 반영하는 측면입니다.
스프링 웹, 특히 스프링 부팅 애플리케이션에서 요청이 성공적으로 호출되면 아래 그림과 같이 일반적으로 객체를 json 형식으로 반환합니다.
그러나 요청이 RuntimeException 던지면 어떨까요? 처리를 수행하지 않으면 다시 전화하면 다음 페이지가 나타납니다.
즉, 통화에서 오류가 발생하면 스프링 부츠가 요청을 기본적으로 /error 경로에 매핑합니다. 해당 경로 요청 프로세서가 없으면 위의 Whitelabel 오류 페이지로 돌아갑니다.
1. 오류 처리 페이지를 사용자 정의합니다
물론 런타임 예외를 처리하지 않는 것은 불가능합니다! 일반적인 관행은 통합 오류 페이지를 사용자 정의한 다음 반환하는 것입니다. 위의 아이디어에 따르면, 우리는 요청 경로 /error 있는 컨트롤러를 구현합니다. 컨트롤러는 리소스 경로 주소를 반환하고 요청 맵 /error 가있는 컨트롤러를 정의하고 ErrorController 인터페이스를 구현합니다. 코드는 다음과 같습니다.
MyErrorPageController
package com.example.demo.controller.handler.errorpage; import org.springframework.web.servlet.error.errorcontroller; import org.spramframework.stereotype.controller; import org.springframework.bind.annotation.requestmapping;/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * myerrorpagecontroller. * * 설명 : 사용자 정의 오류 페이지 * * @Author : huangjiawei * @since : 2018 년 6 월 13 일 * @version : $ $ $ $ $ $ $ $ $ $ Changedby $ * */ @controllerpublic class myerRorpageController는 ErrorController {@requestmapping ( "/error") {return "; html"; //이 리소스는 리소스/정적 디렉토리}에 있습니다} @override public string geterRorpath () {return null; }} 그런 다음 reosurces/static 디렉토리에서 error.html 파일을 만듭니다.
<! doctype html> <html> <head> <meta charset = "utf-8"> <title> 여기에 제목 삽입 </title> </head> <body> <h1> 오류 페이지입니다! 리소스/정적 디렉토리에 저장되었습니다. 기본 호출은 스프링 부팅 오류 </h1> </body> </html>에 있습니다
http://localhost:7000/demo/getUserInfoWithNoHandler.json 다시 요청하십시오.
@ControllerAdvice , @ResponseBody 및 @ExceptionHandler 사용하여 예외를 균일하게 처리합니다.
봄에는 위의 세 가지 주석이 통합 예외 처리에 사용될 수 있습니다. 기본적으로 시스템에 나타나는 특정 유형의 예외에 대해 통합 프로세서 핸들러를 정의 할 수 있습니다. 예를 들어, 시스템이 NullPointerException 던지면 NullPointerException 위해 특별히 프로세서를 정의 할 수 있습니다. 코드는 다음과 같습니다.
getUserInfoWithNullPointerException 인터페이스
/** * 널 포인터 오류 처리 테스트 * @return * @throws nullPointerException */ @requestMapping (value = "getUserInfowithNullPointerException.json", method = requestMethod.get) 공개 학생 getUserInfowithnullPointerException () rasherPointerException (inullPointerExcement);
NullPointerExceptionHandler.java
package com.example.demo.controller.handler; import org.springframework.web.bind.annotation.controlleradvice; import org.springframework.bind.annotation.exception.exceptionhandler; import org.spramework.web.bind.annotation.respronge bidence; com.example.demo.pojo.errorreturn;/** * * 클래스 NullPointerExceptionAndler. * * 설명 : null 포인터 처리 * * @author : huangjiawei * @since : 2018 년 6 월 13 일 * @version : $ $ $ $ $ $ $ $ $ Changedby $ */ @controllerAdvicepublic class nullPointerExceptionHandler {@exceptionHandler (nullPointerexception.class) @voplicbody (nullPoineCection) {respoybody (nullPoineCection). e.printstacktrace (); errorreturn error = new ErrorReturn (); error.setReturnCode ( "-1"); error.setdesc ( "널 포인터 예외가 발생했습니다!"); 반환 오류; }} 브라우저 실행 : http://localhost:7000/demo/getUserInfoWithNullPointerException.json
마찬가지로 다른 런타임 예외에 통합 프로세서를 제공 해야하는 경우 각 예외 유형의 프로세서를 위와 같이 정의 할 수도 있습니다. 예를 들어, ArithmeticException 의 프로세서를 정의하려면 클래스 또는 메소드 만 작성 한 다음 ArithmeticException.class 메소드에서 @ExceptionHanler 주석에 추가하여 예외 유형을 지정하면됩니다.
그러나 이러한 방식으로 각 예외 유형에 대한 예외 처리 클래스 또는 메소드가 정의된다는 것을 알았습니다. 런타임에는 예외 유형이 많이 있으므로 각 유형의 프로세서 클래스 또는 메소드를 지정하는 것은 불가능합니다. 이 경우 봄도 해결할 수 있습니다. ArithmeticException 과 같은 특정 유형의 예외에 대한 프로세서를 정의하지 않으면 Exception 또는 Throwable 프로세서를 정의하여 균일하게 처리 할 수 있습니다.
이를 수행하는 장점은 프로세서 클래스의 수를 줄이고 예외 처리를 부모 클래스로 전송한다는 것입니다. 이는 상속의 주요 이점이기도합니다! 그러나 특정 유형의 예외 및 Exception 프로세서를 동시에 정의 할 때주의를 기울이면 반드시 우선 순위 관계가있는 것은 아닙니다. 즉, 부모 예외 프로세서 만 실행되는 것은 아닙니다. A 프로세서가 아닌 B 프로세서뿐만 아니라 B 프로세서뿐만 아니라 프로세서 A 만 실행할 수 있습니다. 예를 들어, NullPointerExceptionHandler 예외는 Exception 로 전달됩니다 (그러나 ArithmeticException Exception 로 전달되지 않습니다).
이제 위의 NullPointerExceptionHandler 와 아래의 ExceptionThrowableHandler 모두 정의한다고 가정 해 봅시다. 그런 다음 NullPointerException 발생하면 ExceptionThrowableHandler 메소드가 기본적으로 실행됩니다.
ExceptionThrowableHandler.java
package com.example.demo.controller.handler; import org.springframework.web.bind.annotation.controlleradvice; import org.springframework.bind.annotation.exception.exceptionhandler; import org.spramework.web.bind.annotation.respronge bidence; com.example.demo.pojo.errorreturn;/** * * 클래스 ExceptionTrowable Handler. * * 설명 : 일부 예외는 높은 수준의 예외로 전달됩니다. ErrorReTurn dealthRowable () {ErrorReTurn error = new ErrorReturn (); error.setdesc ( "핸들 던지기 가능!"); error.setReturnCode ( "-1"); 반환 오류; } @ExceptionHandler (Exception.Class) @ResponseBody public ErrerEreTurn DealCommoneXception () {ErrorReTurn Error = New ErrorReTurn (); error.setReturnCode ( "-1"); error.setdesc ( "공개 예외 처리!"); 반환 오류; }} 브라우저 실행 : http://localhost:7000/demo/getUserInfoWithNullPointerException.json
Exception 만 실행하지만 널 포인터를 실행하지는 않는 프로세서, 즉 예외 처리가 위쪽으로 전송된다는 것을 알 수 있습니다. ArithmeticException 발생하는 상황을 살펴 보겠습니다.
getUserInfoWithArithmeticException.json
/** * NULL 포인터 오류 처리 테스트 * @return * @Throws NullPointerException */ @requestMapping (value = "getUserInfowitharithmeticexception.json", Method = requestMethod.get) 공개 학생 getUserInfowitharithmeticection () Throws Aritheticexception (););
ArithmeticExceptionHandler.java
package com.example.demo.controller.handler; import org.springframework.web.bind.annotation.controlleradvice; import org.springframework.bind.annotation.exception.exceptionhandler; import org.spramework.web.bind.annotation.respronge bidence; com.example.demo.pojo.errorreturn; @controllerAdvicePublic Class ArithMeticeXceptionHandler { / *** ArithMeticeXceptionException 예외* / @ReSponseBody @ExceptionHandler honge public ErrerCection.class) {ErrerPreturnecception () {new ErrerPreturn (); ErrorObject.setReturnCode ( "-1"); ErrorObject.setDesc ( "예외는 산술 처리에서 발생했습니다!"); 반환 errorobject; }} 브라우저 실행 : http://localhost:7000/demo/getUserInfoWithArithmeticException.json
결과적으로, 예외 처리가 상위 레벨의 ExceptionHandler 로 전송되지 않는 것으로 밝혀졌습니다.
요약 : 특정 유형 및 Exception 유형의 프로세서를 정의 할 때 특히주의하십시오. 모든 예외가 상위 레벨에서 처리되는 것은 아닙니다. 프로세서 클래스의 수만 줄이고 각 특정 유형의 프로세서에 클래스 또는 메소드를 추가하려면 instanceof 인스턴스를 사용하여 예외 유형을 판단하는 것이 좋습니다.
다음 코드에서와 같이 공개 예외 처리기 만 설정하고 Exception 예외를 처리하며 instanceof 사용하여 판단을 내립니다.
@ExceptionHandler (Exception.Class) @ResponseBodyPublic ErrorReTurn DealCommOnexception (Exception e) {ErrorReturn Error = New ErrorReTurn (); // 여기에서 instanceOf를 사용하여 예외 유형을 결정할 수 있습니다. if (e instancef arithmeticexception) {error.setreturncode ( "-1"); error.setdesc ( "arithmeticexception handling!"); 반환 오류; } system.err.println ( "예외"); error.setReturnCode ( "-1"); error.setdesc ( "공개 예외 처리!"); 반환 오류;} 브라우저는 다음과 같이 ArithmeticException 던지는 인터페이스를 실행합니다.
이 기사의 코드 주소 : https://github.com/smallercoder/spring_exceptionhandler
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.