Java異常分類及び統一処理

8945 ワード

一、異常分類
JAva異常は「検査」と「非検査」の2種類に分けられ、「検査」の2文字は、コードコンパイル時にコンパイラが異常処理(キャプチャまたは上向き)を行ったかどうかをチェックし、検査が必要な異常に分類して処理しなければコンパイルは通れないという意味です.
初学の时、よくどうして异常がこのように分类して処理すると思っていますか?後でいくつか分かって、異常は2種類にすぎません:主観と客観、1つの大多数の情況の下で避けることができて、1つの大多数の情況の下で避けることができません.
NullPointerExceptionのような異常は、プログラマーの素質に結びついていることが多く(開発がよく、テストがよく、システムの実行後に飛び出すことはほとんどありません)、基本的には避けることができます.java文法は当初、それらを「非検査異常」と分類し、プログラマーやコンパイラにも多くのことを省きました.
IOExceptionのような外在的な環境に関連する異常は、ほとんど避けられない(いつの日かネットワークが切れたとは限らない)が、予期せぬ場合、プログラムはやはり何かをしなければならないので、コンパイラはプログラマーに、これらの予期せぬ異常を処理したかどうかをチェックする必要がある.Exceptionオブジェクトがノードに渡されると、ユーザーにプロンプトを返す(「システムが忙しいので、再試行してください」)、監視プラットフォームに異常メッセージをプッシュするなど、いくつかの措置を実行できます.
二、異常の統一復帰処理
1、容器処理
以下にTomcatの処理方式を列挙し、web.xmlの下で構成し、http返却コードまたはExceptionタイプで処理する.
<error-page>
     <error-code>404error-code>
     <location>/WEB-INF/views/error/404.jsplocation>
error-page>

<error-page>
     <error-code>500error-code>
     <location>/WEB-INF/views/error/500.jsplocation>
error-page> 

<error-page>
     <exception-type>java.lang.Throwableexception-type>
     <location>/WEB-INF/views/error/throwable.jsplocation>
error-page>
欠点:ajaxなどhtmlを返す必要のないリクエストを処理できません.
2、フレーム処理
    Spring MVC     
  • Spring MVCに付属の単純な例外プロセッサS i m p l e MappingExceptionResolver
  • を使用
  • インタフェースHandlerExceptionResolverカスタム例外プロセッサを実現する.(ajaxなどの拡張をサポートする推奨)
  • @ExceptionHandler注記を使用した異常処理
  • 第(1)種、spring-mvc.xmlの下で配置する
    
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
     <property name="exceptionMappings">
      <props>
        
           
       <prop key="com.test.MyException1">/error/e1prop>
       <prop key="com.test.MyException2">/error/e2prop>
        
       <prop key="java.lang.Throwable">/error/500prop>
      props>
     property>
    bean>
    欠点:htmlを返す必要のないリクエストを処理できない
    第(2)種,カスタムHandlerExceptionResolverインタフェースの実装クラス
    /**
     *         :  ajax
     * @author tangqing
     *
     */
    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;
        }
    }
    spring-mvc.xmlでプロセッサを登録
    id="exceptionHandler" class="com.test.MyExceptionHandler"/>
    利点:ajaxリクエストを処理することができ、異常な監視などの機能拡張を実現するのに便利です.
    第(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).フレームはコンテナ内で動作し、フレームが優先的に異常を取得して戻る処理を行うと、コンテナはマッピングされません.