<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    通用的異常類的設(shè)計(jì)

    在設(shè)計(jì)一個(gè)新的異常類時(shí),首先看看是否真正的需要這個(gè)異常類。一般情況下盡量不要去設(shè)計(jì)新的異常類,而是盡量使用java中已經(jīng)存在的異常類。

    如:IllegalArgumentException, UnsupportedOperationException等。

    不管是新的異常是chekced異常還是unChecked異常。我們都必須考慮異常的嵌套問題。

    比如:

    1 public void methodA() throws ExceptionA{  
    2 
    3                  
    4 
    5         throw new ExceptionA();       
    6 
    7     }

    方法methodA聲明會(huì)拋出ExceptionA.

    public void methodB() throws ExceptionB

    methodB聲明會(huì)拋出ExceptionB,當(dāng)在methodB方法中調(diào)用methodA時(shí),ExceptionA是無法處理的,所以ExceptionA應(yīng)該繼續(xù)往上拋出。一個(gè)辦法是把methodB聲明會(huì)拋出 ExceptionA,但這樣已經(jīng)改變了MethodB的方法簽名。一旦改變,則所有調(diào)用methodB的方法都要進(jìn)行改變。另一個(gè)辦法是把ExceptionA封裝成ExceptionB,然后再拋出。如果我們不把ExceptionA封裝在ExceptionB中,就丟失了根異常信息,使得無法跟蹤異常的原始出處。

    代碼如下:

     

     1 public void methodB()throws ExceptionB{  
     2 
     3           try{  
     4 
     5               methodA();  
     6 
     7                
     8 
     9            }    catch(ExceptionA ex){  
    10 
    11               throw new ExceptionB(ex);  
    12 
    13             }  
    14 
    15         }

    ExceptionB嵌套一個(gè)ExceptionA,我們暫且把ExceptionA稱為“起因異常”,因?yàn)?/span>ExceptionA導(dǎo)致了ExceptionB的產(chǎn)生,這樣才不使異常信息丟失。所以我們?cè)诙x一個(gè)新的異常類時(shí),必須提供這樣一個(gè)可以包含嵌套異常的構(gòu)造函數(shù),并有一個(gè)私有成員來保存這個(gè)“起因異常”。

    代碼如下:

      

    1 public Class ExceptionB extends Exception{  
     2 
     3         private Throwable cause;  
     4 
     5            
     6 
     7         public ExceptionB(String msg, Throwable ex){  
     8 
     9             super(msg);  
    10 
    11             this.cause = ex;  
    12 
    13         }  
    14 
    15            
    16 
    17         public ExceptionB(String msg){  
    18 
    19             super(msg);  
    20 
    21         }  
    22 
    23        
    24 
    25         public ExceptionB(Throwable ex){  
    26 
    27             this.cause = ex;  
    28 
    29         }  
    30 
    31     }

    當(dāng)然,我們?cè)谡{(diào)用printStackTrace方法時(shí),需要把所有的“起因異常”的信息也同時(shí)打印出來。所以我們需要覆寫printStackTrace方法來顯示全部的異常棧跟蹤。包括嵌套異常的棧跟蹤。

    代碼如下:

     1 public void printStackTrace(PrintStrean ps){  
     2 
     3         if(cause == null){  
     4 
     5             super.printStackTrace(ps);  
     6 
     7         }else{  
     8 
     9             ps.println(this);  
    10 
    11             cause.printStackTrace(ps);  
    12 
    13         }  
    14 
    15     }  

    一個(gè)完整的支持嵌套的checked異常類源碼如下。我們?cè)谶@里暫且把它叫做NestedException

     1 public class NestedException extends Exception {
     2 
     3     private Throwable cause;
     4 
     5     public NestedException(String msg) {
     6 
     7         super(msg);
     8 
     9     }
    10 
    11     public NestedException(String msg, Throwable ex) {
    12 
    13         super(msg);
    14 
    15         this.cause = ex;
    16 
    17     }
    18 
    19     public Throwable getCause() {
    20 
    21         return (this.cause == null ? this : this.cause);
    22 
    23     }
    24 
    25     public getMessage() {
    26 
    27         String message = super.getMessage();
    28 
    29         Throwable cause = getCause();
    30 
    31         if (cause != null) {
    32 
    33             message = message + ";nested Exception is " + cause;
    34 
    35         }
    36 
    37         return message;
    38 
    39     }
    40 
    41     public void printStackTrace(PrintStream ps) {
    42 
    43         if (getCause == null) {
    44 
    45             super.printStackTrace(ps);
    46 
    47         } else {
    48 
    49             ps.println(this);
    50 
    51             getCause().printStackTrace(ps);
    52 
    53         }
    54 
    55     }
    56 
    57     publicvoid printStackTrace(PrintWrite pw) {
    58 
    59         if (getCause() == null) {
    60 
    61             super.printStackTrace(pw);
    62 
    63         } else {
    64 
    65             pw.println(this);
    66 
    67             getCause().printStackTrace(pw);
    68 
    69         }
    70 
    71     }
    72 
    73     public void printStackTrace() {
    74 
    75         printStackTrace(System.error);
    76 
    77     }
    78 
    79 }
    80 
    81 

    同樣要設(shè)計(jì)一個(gè)unChecked異常類也與上面一樣。只是需要繼承RuntimeException

    可以參看一些開源框架中的一些通用的異常的設(shè)計(jì),比如Spirng中的NestedCheckedExceptionIbatis中的NestedException等,了解更多異常的設(shè)計(jì)和處理的信息。

    posted on 2008-05-07 17:30 云淡風(fēng)清 閱讀(676) 評(píng)論(0)  編輯  收藏 所屬分類: Java


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    <2008年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(1)

    隨筆分類(15)

    隨筆檔案(15)

    收藏夾(1)

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 在线观看国产情趣免费视频| 免费人成在线观看视频高潮| 亚洲国产成人VA在线观看| 免费a级黄色毛片| 国产亚洲漂亮白嫩美女在线 | 免费A级毛片在线播放| 在线看免费观看AV深夜影院| 1区1区3区4区产品亚洲| 4虎1515hh永久免费| 免费人成激情视频| 日韩在线视频线视频免费网站| 免费毛片a在线观看67194| 亚洲国产精品午夜电影| 一区二区三区AV高清免费波多| 亚洲综合色区在线观看| 精品亚洲AV无码一区二区三区| 在线观看免费中文视频| 亚洲三区在线观看无套内射| 国产传媒在线观看视频免费观看 | 国产亚洲精品美女久久久久久下载| 成人毛片100免费观看| 国产成A人亚洲精V品无码性色| 国产免费啪嗒啪嗒视频看看| 一个人看的免费视频www在线高清动漫| 亚洲高清最新av网站| 国产成人无码精品久久久久免费| 亚洲JIZZJIZZ中国少妇中文| 国产成人高清精品免费观看| 亚洲AV无码久久| 久久激情亚洲精品无码?V| 亚洲一级毛片免费看| 在线看免费观看AV深夜影院| 亚洲爆乳成av人在线视菜奈实| 亚洲av午夜精品一区二区三区| 日韩免费电影网站| 亚洲人成网站18禁止一区| a级毛片毛片免费观看久潮| 亚洲中文字幕无码专区 | 国产成人精品亚洲| 亚洲成人在线电影| 国产91久久久久久久免费|