posts - 176, comments - 240, trackbacks - 0, articles - 7

              在witrix平臺(tái)中,異常處理沒(méi)有采用java語(yǔ)法支持的checked exception, 也不提倡使用自定義的異常類, 而是定義了少數(shù)幾個(gè)RuntimeException基類,一般是CommonException(RuntimeException的派生類)。
              在我自己的經(jīng)驗(yàn)中,checked exception從未發(fā)揮過(guò)實(shí)質(zhì)性的作用。checked exception在某種程度上破壞了封裝性原則。我們一般不會(huì)在最細(xì)的粒度上處理異常,而是在某個(gè)統(tǒng)一的模塊節(jié)點(diǎn)處進(jìn)行。如果使用checked exception, 則從最底層的調(diào)用到具體異常處理層的整個(gè)調(diào)用堆棧上的函數(shù)都必須明確標(biāo)記自己不處理該異常,這是完全不必要的負(fù)擔(dān)。這種細(xì)粒度上的負(fù)擔(dān)往往將程序員引導(dǎo)到 錯(cuò)誤的方向上去,例如編寫catch塊直接捕獲異常
            try{
               ...
            }catch(MyException e){
               e.printStackTrace();
            }
          在witrix平臺(tái)中通過(guò)包裝類來(lái)將checked exception包裝為RuntimeException, 而且除了在最終代碼處理模塊決不屏蔽異常。
           try{
              ...
           }catch(IOException e){
           throw Exceptions.source(e); // 此時(shí)會(huì)自動(dòng)trace異常堆棧及異常消息
           }

          (后來(lái)看到Bruce Eckel的文章Does Java need Checked Exception,發(fā)現(xiàn)大家在對(duì)待checked exception的態(tài)度上倒是心有戚戚焉。)

               一般使用自定義的異常類似乎是要將類名作為錯(cuò)誤返回碼使用,利用java編譯器可以做所謂的強(qiáng)類型檢查,這實(shí)在是一種概念上的浪費(fèi)。畢竟創(chuàng)建并維護(hù)一個(gè) java類還是有一定的代價(jià)的,特別是錯(cuò)誤碼經(jīng)常變動(dòng)而且數(shù)量不菲。實(shí)際上,java類庫(kù)的設(shè)計(jì)中也是盡量重用已有的異常類,例如整個(gè)jdbc包只拋出 SQLException異常,xml包只拋出SAXException異常。

               使用異常,常見(jiàn)的方法是拋出一個(gè)字符串消息,例如 throw new MyException("the object manager does not contains the object :" + objectName);
          這種做法的主要問(wèn)題是,字符串異常消息無(wú)法進(jìn)行進(jìn)一步的處理,因而只能直接顯示給最終用戶,這一方面限制了錯(cuò)誤顯示的格式和方式,另一方面也不利于程序的多語(yǔ)言支持。
               witrix平臺(tái)中拋出異常的標(biāo)準(zhǔn)方法為
           throw Exceptions.code(errorCode).param(paramValue).param(paramName,paramValue);
          例如
              throw Exceptions.code("web.CAN_err_missing_object_in_manager").param(objectName).param(objectManager);

          class Exceptions{
              public static CommonException code(String errorCode){
            return new CommonException(code);
           }
          }

          class CommonException extends RuntimeException{
           public CommonException param(Object paramValue){
            ...
            return this;
           }
          }
                Exceptions規(guī)定只使用規(guī)范格式的錯(cuò)誤碼而不是任意格式的異常消息。這樣在捕獲異常之后,就可以根據(jù)錯(cuò)誤碼和當(dāng)時(shí)的語(yǔ)言Locale設(shè)置來(lái)決定最終顯示的消息格式。
                同時(shí)CommonException采用流式設(shè)計(jì)來(lái)支持任意數(shù)量的自定義參數(shù)。這一方面減少了自定義異常類的需求,另一方面也避免了將參數(shù)與錯(cuò)誤碼混合的傾向,即我們就不會(huì)傾向于
          使用 throw Exceptions.code("the object manager does not contains the object :" + objectName);

          主站蜘蛛池模板: 观塘区| 冕宁县| 滦南县| 东平县| 达日县| 阿鲁科尔沁旗| 平昌县| 花垣县| 曲水县| 大庆市| 缙云县| 利川市| 灵山县| 桃源县| 顺义区| 历史| 元朗区| 菏泽市| 忻州市| 朔州市| 丹凤县| 沙雅县| 鲁甸县| 高安市| 恩平市| 扬中市| 商南县| 横峰县| 玛沁县| 东乌珠穆沁旗| 曲松县| 武平县| 红原县| 九龙城区| 固阳县| 东安县| 称多县| 贡嘎县| 沙坪坝区| 阿图什市| 漳浦县|