異常處理措施——針對(duì)有效的錯(cuò)誤處理設(shè)計(jì)異常管理系統(tǒng)作者:Jean-PierreNorguet,JavaWorld.com,11/15/071.摘要在面向?qū)ο蟮膽?yīng)用程序中,由于代碼重載、錯(cuò)誤的問(wèn)題處理方式,導(dǎo)致異常有越來(lái)越多的趨勢(shì)。在這篇文章中,作者Jean-PierreNorguet介紹了如何設(shè)計(jì)異常,來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的、可讀的、健壯的、靈活的、面向調(diào)試的及用戶(hù)友好的錯(cuò)誤處理" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

異常處理措施

系統(tǒng) 2170 0

<!----><!----><!----> <!---->

異常處理措施

——針對(duì)有效的錯(cuò)誤處理設(shè)計(jì)異常管理系統(tǒng)

作者: Jean-Pierre Norguet JavaWorld.com,11/15/07

<!----> 1. ??????????? <!----> 摘要

在面向?qū)ο蟮膽?yīng)用程序中,由于代碼重載、錯(cuò)誤的問(wèn)題處理方式,導(dǎo)致異常有越來(lái)越多的趨勢(shì)。在這篇文章中,作者 Jean-Pierre Norguet 介紹了如何設(shè)計(jì)異常,來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的、可讀的、健壯的、靈活的、面向調(diào)試的及用戶(hù)友好的錯(cuò)誤處理系統(tǒng)。在本文中,作者提出了簡(jiǎn)單異常集合的設(shè)計(jì),并且給出了 Java 實(shí)現(xiàn)的源代碼。最后,作者介紹了如何將這樣的設(shè)計(jì)集成到一個(gè) Java 的企業(yè)應(yīng)用程序中。

在一個(gè)面向?qū)ο蟮捻?xiàng)目中,設(shè)計(jì)異常處理的最好途徑從來(lái)也沒(méi)有如我們期待的那樣清晰。在舊的大的系統(tǒng)中,異常的發(fā)生有激增的趨勢(shì),最終達(dá)到幾百行的代碼。對(duì)于一些常見(jiàn)的編程場(chǎng)景,異常檢查是必須的,但是也會(huì)帶來(lái)可觀的處理開(kāi)銷(xiāo)。雖然安靜的異常捕獲可以找到問(wèn)題的源頭,但是避免不了它的一些缺點(diǎn)(雖然這些缺點(diǎn)不是致命的);比如你必須熟悉這些代碼。

<!----> 2. ??????????? <!---->

本文將介紹如何通過(guò)有限的異常集合來(lái)滿(mǎn)足一個(gè)錯(cuò)誤處理的需求。在建立起一個(gè)好的錯(cuò)誤處理系統(tǒng)框架之后,將會(huì)指出異常處理設(shè)計(jì)中常見(jiàn)的錯(cuò)誤,這些錯(cuò)誤將會(huì)逐漸損害應(yīng)用程序的性能;然后將會(huì)給出一個(gè)異常集合的例子,這個(gè)例子支持本文討論的異常處理設(shè)計(jì)的基本功能:異常系統(tǒng)應(yīng)該被設(shè)計(jì)成能夠幫助外部系統(tǒng)(用戶(hù))處理未知情況(在運(yùn)行時(shí)發(fā)生),而不是設(shè)計(jì)成能夠幫助編程人員處理已知情況;還會(huì)介紹本文給出例子中的各個(gè)類(lèi)的含義以及如何在一個(gè)特定的 Java 企業(yè)應(yīng)用程序體系中使用它們;最后給出這個(gè)例子的 Java 實(shí)現(xiàn)。

<!----> 3. ??????????? <!----> 錯(cuò)誤處理需求

什么是一個(gè)好的錯(cuò)誤處理系統(tǒng)?拋開(kāi)審美角度的考慮,一個(gè)好的錯(cuò)誤處理系統(tǒng)通常要符合下面的條件:

·任何異常都不會(huì)導(dǎo)致應(yīng)用系統(tǒng)的崩潰。

·在發(fā)生異常時(shí),允許應(yīng)用程序進(jìn)行相應(yīng)的處理。

·顯示給用戶(hù)的錯(cuò)誤信息要清晰的描述發(fā)生了什么錯(cuò)誤以及應(yīng)該采取什么樣的處理。

·如果需要輔助信息,錯(cuò)誤信息還要幫助用戶(hù)與幫助部門(mén)交互,為幫助部門(mén)團(tuán)隊(duì)提供必要的信息,是他們能夠快速的容易的重現(xiàn)錯(cuò)誤。

·日志信息能為開(kāi)發(fā)團(tuán)隊(duì)人員在識(shí)別錯(cuò)誤、在應(yīng)用程序代碼中定位錯(cuò)誤產(chǎn)生的位置以及修正錯(cuò)誤提供必要的信息。

·錯(cuò)誤處理代碼不會(huì)降低應(yīng)用程序代碼的可讀性。必要的時(shí)候,錯(cuò)誤處理僅僅是一個(gè)安全網(wǎng),它對(duì)應(yīng)用程序的核心功能具有較低的反問(wèn)權(quán)限。

一個(gè)錯(cuò)誤處理系統(tǒng)的設(shè)計(jì)符合這些條件才能被認(rèn)為是完整的。對(duì)于大多數(shù) Java 開(kāi)發(fā)人員來(lái)說(shuō)接下來(lái)的問(wèn)題就是:如何靈活的使用異常類(lèi)來(lái)設(shè)計(jì)一個(gè)錯(cuò)誤處理系統(tǒng),而不是通過(guò)簡(jiǎn)單的重載它們來(lái)實(shí)現(xiàn)。

<!----> 3.1. ??? <!----> 應(yīng)該避免的常見(jiàn)用法

可以通過(guò)一個(gè)有限的異常類(lèi)集合來(lái)滿(mǎn)足上面提到的需求。當(dāng)設(shè)計(jì)這樣的一個(gè)異常類(lèi)集合是,你應(yīng)該避免一些常見(jiàn)的用法,例如:
·對(duì)每個(gè)問(wèn)題都定義的異常類(lèi),這樣會(huì)導(dǎo)致系統(tǒng)中異常類(lèi)的激增。

·對(duì)每個(gè)包定義一個(gè)異常類(lèi)集合,這沒(méi)什么用處而且也會(huì)導(dǎo)致系統(tǒng)中異常類(lèi)的激增。

·對(duì)每個(gè)異常都提供 checked non-checked 兩個(gè)版本,引入了檢測(cè)異常開(kāi)銷(xiāo)。異常語(yǔ)義的后序副本也會(huì)混淆異常處理的設(shè)計(jì)。

·最后,拋出和捕獲通用異常在很多方面也是錯(cuò)誤傾向。

本文下面提到的異常類(lèi)集合按照錯(cuò)誤處理語(yǔ)義分類(lèi),避免了異常處理相關(guān)的常見(jiàn)問(wèn)題。尤其是在應(yīng)用程序的規(guī)模和復(fù)雜程度增長(zhǎng)是,這種方式更值得推薦。

<!----> 4. ??????????? <!----> 異常處理設(shè)計(jì)

1 展示了異常類(lèi)集合的設(shè)計(jì),這個(gè)設(shè)計(jì)避免了異常類(lèi)激增、檢測(cè)異常開(kāi)銷(xiāo)和異常的安靜捕獲。

<!----><!----> <!---->

1. 一個(gè)異常類(lèi)集合的例子

在這個(gè)圖中你會(huì)發(fā)現(xiàn)有些異常是 checked ,而有些是 runtime 。為了避免異常拋出聲明的開(kāi)銷(xiāo), checked 異常基于下面兩個(gè)目的被保留下來(lái):

<!----> 1、 ? <!----> 告訴調(diào)用方法,在這個(gè)處理過(guò)程中發(fā)生了一個(gè)可預(yù)見(jiàn)的意外情況。在這種情況下,問(wèn)題的語(yǔ)義已經(jīng)被處理方法定義了,直接捕獲會(huì)更好。

<!----> 2、 ? <!----> 告訴外部系統(tǒng)發(fā)生了一個(gè)未解決的問(wèn)題,需要根據(jù)異常語(yǔ)義來(lái)處理這個(gè)問(wèn)題。

<!----> 4.1. ??? <!----> 理解異常語(yǔ)義

在這里闡明本文對(duì)異常語(yǔ)義的定義。在作者看來(lái),設(shè)計(jì)對(duì)象的類(lèi)需要根據(jù)它們?cè)诂F(xiàn)實(shí)世界中的等價(jià)物。一個(gè)水果或者一個(gè)人很容易設(shè)計(jì)成一個(gè) Java 對(duì)象類(lèi)。但是異常設(shè)計(jì)卻不同:因?yàn)橐粋€(gè)水果或者一個(gè)人在現(xiàn)實(shí)世界中非常直觀,異常卻不同。實(shí)際上,上面的兩類(lèi)異常中,只有第一類(lèi)在現(xiàn)實(shí)世界中存在;而第二類(lèi)異常模擬了系統(tǒng)執(zhí)行過(guò)程中會(huì)發(fā)生什么錯(cuò)誤,因此在系統(tǒng)之外就不存在了。直接捕獲因此也只對(duì)第一類(lèi)異常適合。

作者的設(shè)計(jì)建議就是異常應(yīng)該根據(jù)它們的目的來(lái)設(shè)計(jì)。系統(tǒng)內(nèi)部的、自我調(diào)整的異常就意味著是幫助系統(tǒng)來(lái)處理不可預(yù)見(jiàn)的情況。這些異常的目的也就不是模擬系統(tǒng)中的問(wèn)題,而是給一個(gè)系統(tǒng)需要采取什么措施的指示。

<!----> 5. ??????????? <!----> 一個(gè)異常類(lèi)集合的例子

在圖 1 中你可以看到四類(lèi)異常對(duì)應(yīng)四類(lèi)處理,如下:

<!----> 1、 ? <!----> BusinessException: 一種異常情況發(fā)生。這種情況是可預(yù)見(jiàn)的,也可以被調(diào)用方法檢測(cè)到并立即采取措施。

<!----> 2、 ? <!----> ParameterException: 輸入的數(shù)據(jù)對(duì)處理過(guò)程不合法。用戶(hù)被要求重新輸入有效數(shù)據(jù)或者修改處理過(guò)程的條件。

<!----> 3、 ? <!----> TechnicalException: 技術(shù)問(wèn)題,如無(wú)效的 SQL 語(yǔ)句。這種情況下,請(qǐng)求操作未完成。用戶(hù)需要和幫助部門(mén)聯(lián)系,調(diào)查問(wèn)題的原因;或者嘗試其它的服務(wù)。對(duì)使用系統(tǒng)的其它用戶(hù)沒(méi)有影響。

<!----> 4、 ? <!----> CriticalTechnicalException: 技術(shù)問(wèn)題,如數(shù)據(jù)庫(kù)崩潰。在這種情況下整個(gè)應(yīng)用程序都 ub 可用。用戶(hù)被建議稍后重試。在問(wèn)題修復(fù)前,所有的用戶(hù)都不能使用系統(tǒng)。

這個(gè)異常類(lèi)集合只是一個(gè)例子;很多異常類(lèi)集合都可以參照它來(lái)定義。例如, TechnicalException CriticalTechnicalException 可以被設(shè)計(jì)成一個(gè)類(lèi),這個(gè)類(lèi)聲明一個(gè) severity 布爾屬性。重要的是關(guān)注采取什么處理措施而不是什么問(wèn)題引起異常。

<!----> 5.1. ??? <!----> 異常日志記錄

雖然異常語(yǔ)義關(guān)注采取的措施,但是出現(xiàn)的問(wèn)題也很重要。例如,開(kāi)發(fā)團(tuán)隊(duì)人員可以使用這些信息調(diào)試代碼。在異常處理設(shè)計(jì)中,導(dǎo)致異常的信息能夠在以用程序的錯(cuò)誤日志中發(fā)現(xiàn)。在適當(dāng)?shù)奈恢檬褂靡粋€(gè)好的日志記錄框架,這個(gè)框架能夠有效的從異常信息和堆棧跟蹤中記錄問(wèn)題信息。

剩下的唯一問(wèn)題就是怎么樣設(shè)計(jì)異常類(lèi)使之能夠方便的返回信息。一個(gè)解決方案就是為異常類(lèi)聲明一個(gè) id 屬性來(lái)代表遇到的問(wèn)題的種類(lèi)。另外,問(wèn)題自身可帶有通用異常,也就是把通用異常內(nèi)嵌到應(yīng)用程序異常中。在捕獲的時(shí)候,原始的信息和堆棧跟蹤信息能夠通過(guò)內(nèi)嵌的異常得到。 id 屬性和內(nèi)嵌異常是包裝問(wèn)題的兩種途徑。

<!----> 6. ??????????? <!----> 異常處理流程的設(shè)計(jì)

一旦你已經(jīng)設(shè)計(jì)好異常類(lèi)本身了,下一步需要思考的就是它在應(yīng)用程序中的處理流程。一個(gè)標(biāo)準(zhǔn)的 JEE 應(yīng)用程序體系通常包括四個(gè)部分:展現(xiàn)、業(yè)務(wù)、集成、持久。異常經(jīng)常在集成和持久部分被拋出。在業(yè)務(wù)部分,里層的捕獲 checked 異常,而外層捕獲 runtime 異常并根據(jù)它們的類(lèi)型來(lái)采取相應(yīng)的處理措施。也可以在業(yè)務(wù)部分拋出一些 checked 異常并且捕獲它們。在這種模式下,集成和持久部分,包括業(yè)務(wù)部分的里層都將 runtime 異常轉(zhuǎn)化成具體的處理措施。圖 2 展示的就是一個(gè)典型的 JEE 應(yīng)用程序異常處理流程。

<!----><!----> <!---->

2. 標(biāo)準(zhǔn) JEE 包體系中異常的處理流程

異常拋出路徑是指從持久部分(假設(shè))發(fā)生問(wèn)題到問(wèn)題被解決所經(jīng)歷的流程。如果持久層的調(diào)用方法能夠解決這個(gè)問(wèn)題,那么這個(gè)異常就直接被捕獲并采取相應(yīng)的處理措施,業(yè)務(wù)流程一切照常;如果問(wèn)題不能被解決,異常將內(nèi)嵌到一個(gè) runtime 異常中經(jīng)過(guò)業(yè)務(wù)部分的中間層傳遞到應(yīng)用程序的上層中,在這里,典型的處理方法就是使用一些應(yīng)用程序控制器來(lái)捕獲這些 runtime 異常并采取相應(yīng)的處理措施,展現(xiàn)層顯示相應(yīng)的錯(cuò)誤信息給用戶(hù)。直接捕獲 checked 異常和推遲捕獲 runtime 異常是異常處理設(shè)計(jì)中的兩種主要方案,如圖 3 所示。

<!----><!----> <!---->

3. 直接捕獲 checked 異常和推遲捕獲 runtime 異常

<!----> 7. ??????????? <!----> 擴(kuò)展 java.lang.Exception

文中提到的異常處理設(shè)計(jì)方案在任何的面向?qū)ο笳Z(yǔ)言中都可以很容易的實(shí)現(xiàn),包括 Java 。一個(gè)相似的異常類(lèi)樹(shù)已經(jīng)在標(biāo)準(zhǔn) Java 庫(kù)中提供了。在這個(gè)庫(kù)中異常被設(shè)計(jì)為 java.lang.Throwable ckeched 異常被設(shè)計(jì)為 java.lang.Exception runtime 異常被設(shè)計(jì)為 java.lang.RuntimeException

java.lang.Exception 下,有大量泛語(yǔ)義的業(yè)務(wù)異常。運(yùn)行時(shí)應(yīng)用程序異常,如 ParamterException TechnicalException CriticalTechnicalException (見(jiàn)圖 1 )各自都設(shè)計(jì)成相應(yīng)的概要異常,如 IllegalArgumentException MissingResourceException IllegalStateException

在應(yīng)用程序中,重用 Java 標(biāo)準(zhǔn)異常是一個(gè)不錯(cuò)的主意,但是由 Java 標(biāo)準(zhǔn)類(lèi)拋出的異常也會(huì)導(dǎo)致一些混亂。你可以通過(guò)擴(kuò)展 java.lang.Exception 的自定義異常類(lèi)樹(shù)來(lái)避免這樣的混亂。通過(guò)自定義的異常類(lèi)樹(shù),你還可以實(shí)現(xiàn)內(nèi)嵌異常和問(wèn)題 ID 。列表 1 給出了文中例子的 Java 代碼實(shí)現(xiàn)。注意,它包括內(nèi)嵌異常和問(wèn)題 ID

列表 1. 通過(guò) Java 代碼實(shí)現(xiàn)內(nèi)嵌異常和問(wèn)題 ID

?

    public class NestedException extends RuntimeException {

   protected Exception nestedException;

   protected int issueId;

   public NestedException(String msg, Exception e, int id) {

      super(msg);

      this.nestedException = e;

      this.issueId = id;

   }

   public Exception getNestedException() {

      return this.nestedException;

   }

   public int getIssue() {

      return this.issueId;

   }

}

public interface Issue {

   public final static int UNDEFINED = 0;

   public final static int EXTERNAL_SERVICE_1_DOWN = 1;

   public final static int EXTERNAL_SERVICE_2_DOWN = 2;

   public final static int SQL_STATEMENT_ERROR = 3;

   // ...

} 
  
?

<!----> 8. ??????????? <!----> 總結(jié)

設(shè)計(jì)一個(gè)滿(mǎn)足好的錯(cuò)誤處理系統(tǒng)需求的異常類(lèi)樹(shù)非常簡(jiǎn)單。簡(jiǎn)單的秘訣就是將設(shè)計(jì)的主要精力集中在系統(tǒng)應(yīng)該采取什么樣的處理措施,而不是關(guān)注會(huì)出現(xiàn)的什么樣的問(wèn)題。在本文的設(shè)計(jì)當(dāng)中,問(wèn)題的信息封裝在異常類(lèi)里面。通過(guò)在處理措施和問(wèn)題之間分配異常語(yǔ)義,讓你將異常類(lèi)樹(shù)限制在一個(gè)有限的異常類(lèi)集合中(可能就六七個(gè)左右)。這種設(shè)計(jì)不僅限制了異常類(lèi)激增,洱海保證代碼的可讀性,使你在以后的開(kāi)發(fā)中以最佳的清晰度來(lái)關(guān)注應(yīng)用程序的業(yè)務(wù)邏輯的編碼。

<!----> 9. ??????????? <!----> 作者簡(jiǎn)介

Jean-Pierre Norguet 擁有布魯塞爾大學(xué)的計(jì)算機(jī)科學(xué)和網(wǎng)絡(luò)工程博士學(xué)位。在 IBM 經(jīng)過(guò)了三年全職的電子商務(wù)應(yīng)用程序關(guān)鍵任務(wù)的 Java 開(kāi)發(fā)后,作為團(tuán)隊(duì)領(lǐng)導(dǎo)者和教練,他擅長(zhǎng)的技術(shù)領(lǐng)域包括了整個(gè)應(yīng)用程序開(kāi)發(fā)周期。目前專(zhuān)注于 Java 技術(shù)、實(shí)體集成和迷你 Web 應(yīng)用的研究。除了一些在線 Java 文章外, Norguet 博士還與 Prentice IBM 出版社一起出版了有關(guān) JEE 的著作,同時(shí)還在 ACM IEEE Springer-Verlag 的國(guó)際研討會(huì)發(fā)表了一些文章。他的業(yè)務(wù)興趣還包括藝術(shù)繪畫(huà)、兼職法語(yǔ)教師和臨時(shí)健康顧問(wèn)。

<!----> 10. ????????? <!----> 相關(guān)資源

本文中提到的異常類(lèi)集合的完整代碼可在 custom exception set 下載。

其它相關(guān)文章

英文原文地址

?

異常處理措施


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 播五月| 一二三区在线观看 | 香蕉18xxoo欧美夜视频 | 香蕉在线观看999 | 中文字幕久久精品波多野结 | 黄片毛片| 亚洲精品视频在线观看视频 | 直接看的毛片 | 中文字幕日本在线 | 超清中文乱码精品字幕在线观看 | 欧美精品久久一区二区三区 | 99久久中文字幕 | 亚洲精品久久99久久一 | 青青青永久免费视频 | 中文精品久久久久国产不卡 | 国产精品va | 久久精品伊人 | 啪啪婷婷 | 国产精品久久久久影院色 | 亚洲毛片免费在线观看 | 欧美日韩一二三区免费视频观看 | 色播性播爱播放影院 | 我要看免费一级毛片 | 五月天综合久久 | 狠狠综合久久久久综合 | 欧美特黄a级猛片a级 | 亚洲 欧洲 自拍 另类 校园 | 国产精品亚洲综合久久 | 久久久久久久免费视频 | 狠狠狠狼鲁欧美综合网免费 | 国产国产人免费观看在线视频 | 日本在线观看永久免费网站 | 狠狠色狠狠色综合系列 | 亚洲人成网站在线观看青青 | 一级毛片一级片 | 四虎影院中文字幕 | 中国一级免费毛片 | 中文毛片 | 视频一区免费 | 精品乱码一区二区三区四区 | 深夜你懂的在线网址入口 |