Java 예외 분류 및 통합 처리 상세 정보

1. 이상 분류
자바 이상은'검사'와'비검사'두 종류로 나뉜다.'검사'라는 단어는 코드를 컴파일할 때 컴파일러가 이상 처리(포획 또는 위로 던지기)를 했는지 검사하는 이상으로 분류하는데 처리하지 않으면 컴파일러가 지나갈 수 없다는 뜻이다.
처음 배울 때, 왜 이상하게 분류 처리해야 하는지 자주 생각했다.나중에 좀 알게 되었다. 이상은 두 가지에 불과하다. 주관과 객관, 하나는 대다수 상황에서 피할 수 있고, 하나는 대다수 상황에서 피할 수 없다.
Null Pointer Exception과 같은 이상은 대부분 프로그래머의 소양과 연결된다. (개발이 잘 되고 테스트가 잘 되어 시스템이 실행된 후에 튀어나오지 않는다.) 기본적으로 피할 수 있다. 자바 문법은 처음에 그것들을'비검사 이상'으로 분류했고 프로그래머와 컴파일러에게도 많은 일을 절약했다.
그러나 IO Exception과 같은 외적 환경과 관련된 이상은 거의 피할 수 없는 것이다. (어느 날 그 1초에 네트워크가 끊길지 모른다는 것을 가리킨다.) 그러나 우연히 만났을 때 프로그램은 반드시 성과를 내야 하기 때문에 컴파일러는 프로그래머에게 이런 예상치 못한 이상을 처리했는지 확인해 볼 필요가 있다.Exception 대상이 특정한 노드에 전달되면 프로그램은 몇 가지 조치를 실행할 수 있다. 예를 들어 사용자에게 힌트("시스템이 바쁘니 다시 시도하십시오"), 모니터링 플랫폼에 이상 메시지를 보내는 등이다.
2. 비정상적인 통일 반환 처리
1. 용기 처리
다음은 Tomcat의 처리 방식을 웹에서 열거합니다.xml에서 설정하고 http 반환 코드나 Exception 형식에 따라 처리합니다.

<error-page>
 <error-code>404</error-code>
 <location>/WEB-INF/views/error/404.jsp</location>
 </error-page>
 
 <error-page>
 <error-code>500</error-code>
 <location>/WEB-INF/views/error/500.jsp</location>
 </error-page> 
 
 <error-page>
 <exception-type>java.lang.Throwable</exception-type>
 <location>/WEB-INF/views/error/throwable.jsp</location>
 </error-page>
단점: html로 되돌아갈 필요가 없는 요청, 예를 들어ajax를 처리할 수 없습니다.
2. 프레임워크 처리
다음은 Spring MVC의 처리 방법입니다.
(1) Spring MVC가 자체적으로 가지고 있는 간단한 이상 프로세서 Simple Mapping Exception Resolver를 사용합니다.
(2) 인터페이스 HandlerExceptionResolver 사용자 정의 이상 프로세서 구현;(aax 등 확장을 지원하는 것을 권장합니다.)
(3) @ExceptionHandler 메모를 사용하여 예외 처리를 수행합니다.
(1)종,spring-mvc.xml에서 설정

 <!--  Controller  -->
 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  <property name="exceptionMappings">
   <props>
    <!--  --> 
    <!--  -->    
    <prop key="com.test.MyException1">/error/e1</prop>
    <prop key="com.test.MyException2">/error/e2</prop>
    <!--  , --> 
    <prop key="java.lang.Throwable">/error/500</prop>
   </props>
  </property>
 </bean>
단점: html로 돌아가지 않아도 되는 요청을 처리할 수 없습니다. 
(2)종, 사용자 정의 HandlerExceptionResolver 인터페이스 구현 클래스

/**
 *  : ajax
 * @author wangxu
 *
 */
public class MyExceptionHandler implements HandlerExceptionResolver {
 
 public ModelAndView resolveException(HttpServletRequest request,
 HttpServletResponse response, Object handler, Exception ex) {
 
 /*  ajax */
 boolean isAjax = request.getHeader("X-Requested-With") != null
 && "XMLHttpRequest".equals(request
  .getHeader("X-Requested-With").toString());
 if (!isAjax) {
 if (ex instanceof com.test.MyException1) {
 return new ModelAndView("/error/e1");
 } else if (ex instanceof com.test.MyException1) {
 return new ModelAndView("/error/e2");
 } else {
 return new ModelAndView("/error/500");
 }
 }
 String jsonRes = "{\"message\":\"" + " " + "\"}";//  
 PrintWriter out = null;
 try {
 out = response.getWriter();
 request.setCharacterEncoding("utf-8");
 response.setContentType("text/plain;charset=utf-8");
 out.print(jsonRes);
 out.flush();
 } catch (IOException e) {
 e.printStackTrace();
 } finally {
 out.close();
 }
 return null;
 }
}
스프링-mvc.xml 등록 프로세서

장점:aax 요청을 처리할 수 있고 인코딩을 통해 기능 확장을 실현할 수 있다. 예를 들어 이상한 모니터링 등이다.
(3)종, @ExceptionHandler 메모

@Controller
public class TestExceptionHandlerController {
 
 @ExceptionHandler({ MyException1.class })
 public String exception(MyException1 e) {
 return "/error/e1";
 }
 @RequestMapping("/marry")
 public void test() {
 throw new MyException1(" !");
 }
}
단점: @ExceptionHandler 방법은 예외를 던질 수 있는 방법과 함께 Controller 아래에 있어야 합니다.(사용하는 것이 권장되지 않음)
3. 결합
실제 프로젝트에서 이상한 통일된 반환을 처리할 때 사용자 정의 이상이나 확장을 프레임워크에 맡기고 http 반환 코드의 映射을 용기에 맡긴다. http 반환 코드가 더 바깥쪽에 있기 때문에 어떤 것은 프레임워크에 도달할 수 없고 어떤 것은 프레임워크에 있어서 이상이 아니다(예를 들어 404와 Spring MVC).프레임워크는 용기 안에서 실행되며, 프레임워크가 우선적으로 이상을 얻고 반환 처리를 하면 용기는 다시 비치지 않습니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기