봄 부팅 2.X (XI) : 글로벌 예외 처리 (재 인쇄)

머리말

자바 웹 시스템 개발에 상관없이 컨트롤러 층, 서비스 층 또는 층 다오의, 예외를 던질 가능성이 높습니다. 각 프로세스에서 시도 캐치 예외 처리 코드의 다양한 결합 된 경우, 해당 코드가 매우 복잡합니다. 스프링 MVC에서, 우리는 예외의 모든 종류, 개별 접근 방식에서 통합 프로세스를 분리 및 예외 정보를 유지 핸들링 넣을 수 있습니다.

글로벌 솔루션 스프링 MVC에서 처리 예외 트랩은 일반적으로 두 가지 방법이 있습니다 :

글로벌 컨트롤러 레이어의 예외 처리 1. @ControllerAdvice은 주석 + @ExceptionHandler.

resolveException org.springframework.webb.servlet.HandlerExceptionResolver 인터페이스 구현 2. 방법.

@ControllerAdvice + @ExceptionHandler 주석을 사용하여

1. 통합 된 예외 처리 클래스를 정의

@ControllerAdvice
public class GlobalExceptionHandler {

    private Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) {
        log.error("ExceptionHandler ===>" + e.getMessage());
        e.printStackTrace();
        // 这里可根据不同异常引起的类做不同处理方式
        String exceptionName = ClassUtils.getShortName(e.getClass());
        log.error("ExceptionHandler ===>" + exceptionName);
        ModelAndView mav = new ModelAndView();
        mav.addObject("stackTrace", e.getStackTrace());
        mav.addObject("errorMessage", e.getMessage());
        mav.addObject("url", req.getRequestURL());
        mav.setViewName("forward:/error/500");
        return mav;
    }
}

다음, 상기 @ExceptionHandler (값 = Exception.class) 이상 값을 포착이 정의 될 수있다 :

유형 기술
NullPointerException이 응용 프로그램이 비어있는 개체에 액세스하려고 할 때, 슬로우
예외 : SQLException 에 대한 정보 제공 데이터베이스 이상 액세스 에러 또는 다른 오류 메시지
IndexOutOfBoundsException가 정렬 (예를 들어, 정렬 된 배열, 문자열, 또는 벡터)를 나타내는 인덱스가 범위를 벗어난 예외
NumberFormatException이 때 응용 프로그램은 숫자 형으로 문자열을 변환하려고하지만 문자열이 적절한 형식으로 변환 할 수없는 예외가 발생
FileNotFoundException이 파일을 열려고하면 지정된 경로가 발생 실패
IOException이 I / O 예외의 일종이 예외가 발생합니다. 이러한 실패 또는 중단 된 I / O 작업의 이상이 발생 제네릭 클래스
ClassCastException이 개체를 캐스팅하려고 할 때 서브 클래스의 인스턴스 슬로우되지 않는
ArrayStoreException를 예외가 발생하는 잘못된 형식을 저장하려고 할 때 객체의 배열
IllegalArgumentException가 나타 내기 위해서 (때문에) 슬로우 그 방법에 불법적이거나 잘못된 매개 변수를 전달
arithmeticexception이 예외적 인 연산 조건이 발생하면, 슬로우됩니다. 예를 들어, 정수를 「제로로 제산 "이 클래스의 인스턴스를 발생
없는 NegativeArraySizeException 응용 프로그램이 음의 크기와 배열을 만들려고하는 경우에 슬로우
의 경우, NoSuchMethodException 특정의 메소드가 발견되지 않는 경우, 슬로우
SecurityException가 보안 관리자가 예외를 throw하여 보안 위반을 나타내는
UnsupportedOperationException가 요청한 작업이 지원되지 않는 경우, 예외가 발생
RuntimeException을 그 이상 슈퍼 클래스는 자바 가상 머신의 정상 작동 중에 발생할 수있다

/ 오류 / 500 요청 URL을 이동, 모델에 이상 정보 : 응답의 예외 유형을 캡처 할 때, 논리의 defaultErrorHandler () 메소드를 입력합니다.

2. 이상은 보여

보기 컨트롤러 구성

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

    /**
     * 视图控制器配置
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {   
        registry.addViewController("/").setViewName("/index");//设置默认跳转视图为 /index
        registry.addViewController("/error/500").setViewName("/error/500");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
        super.addViewControllers(registry);
        
    }
    
}

보기 템플릿

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Exception</h1>
<h3 th:text="${url}"></h3>
<h3 th:text="${errorMessage}"></h3>
<p  th:each="line : ${stackTrace}" th:text="${line}">  </p>
</body>
</html>

3. 테스트 예외 클래스

@Controller
public class TestController {

    @GetMapping("/index")
    public String hello() {
        int x = 1 / 0;
        return "hello";
    }
}

4. 테스트를 실행

액세스 브라우저 : HTTP : //127.0.0.1 : 8080 / 색인
www.wityx.com

@ControllerAdvice 또한 전처리 및 기타 기능 글로벌 데이터와 글로벌 데이터 바인딩을 달성하기 위해 주석 InitBinder @ 사용할 @ModelAttribute를 결합 할 수있다.

HandlerExceptionResolver 인터페이스를 달성

1. 통합 된 예외 처리 클래스를 정의

@Component
public class GlobalHandlerExceptionResolver implements HandlerExceptionResolver {

    private Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) {
        Exception e = new Exception();
        //处理 UndeclaredThrowableException
        if (ex instanceof UndeclaredThrowableException) {
            e = (Exception) ((UndeclaredThrowableException) ex).getUndeclaredThrowable();
        } else {
            e = ex;
        }
        e.printStackTrace();
        //这里可以根据不同异常引起的类做不同处理方式
        String exceptionName = ClassUtils.getShortName(e.getClass());
        if(exceptionName.equals("ArrayIndexOutOfBoundsException")) {
            log.error("GlobalHandlerExceptionResolver resolveException ===>" + exceptionName);
            ModelAndView mav = new ModelAndView();
            mav.addObject("stackTrace", e.getStackTrace());
            mav.addObject("exceptionName", exceptionName);
            mav.addObject("errorMessage", e.getMessage());
            mav.addObject("url", request.getRequestURL());
            mav.setViewName("forward:/error/500");
            return mav;
        }
        return null;
    }

}

예외로 UndeclaredThrowableException를 발생하면 일반적으로 RPC 인터페이스의 JDK 동적 프록시를 사용하여 장면이나 장면을 기억합니다. 당신이 처리 변환 사전하지 않는 경우, 잡은 예외를 테스트하기로 UndeclaredThrowableException 오히려 진정한 예외 객체보다,했다.

2. 상기 예외 정보를 표시 할

3. 테스트 예외 클래스

@Controller
public class TestController {

    @GetMapping("/test")
    public String test() {
        String[] ss = new String[] { "1", "2" };
        System.out.print(ss[2]);
        return "hello";
    }

}

4. 테스트 실행

테스트 첫 @ControllerAdvice 주석 전에.
액세스 브라우저 : HTTP : //127.0.0.1 : 8080 / 테스트
www.wityx.com

샘플 코드

GitHub의

클라우드 코드

비 특정 지침, 문서 속한 아 사기리 청 한이 모든 소스를 표시하시기 바랍니다.

원제 : 봄 부팅 2.X (XI) : 글로벌 예외 처리

원본 주소 : https://www.zwqh.top/article/info/20

추천

출처www.cnblogs.com/xyy2019/p/11743734.html