業(yè)務(wù)異常的設(shè)計(jì)
業(yè)務(wù)異常的層次結(jié)構(gòu)設(shè)計(jì)在開發(fā)中也是非常重要的要作,業(yè)務(wù)異常體系結(jié)構(gòu)的設(shè)計(jì)方法將直接影響
到異常處理的方法.
對于異常系統(tǒng)的結(jié)構(gòu)通常會(huì)被劃分為三個(gè)層次,第一層為異常的基類,第二層為功能層或者模塊層,
第三層為業(yè)務(wù)異常層,層與層之間是父子工的繼承關(guān)系.
對于一個(gè)通用的異常系統(tǒng)而言,通常會(huì)定義一個(gè)異常基類,假設(shè)是BaseException,該類繼承自RuntimeException
之所以將業(yè)務(wù)異常的基類定義為RuntimeException,是因?yàn)闃I(yè)務(wù)異常是否需要開發(fā)人員在開發(fā)過程中進(jìn)行捕獲的
對于業(yè)務(wù)異常的捕獲交給系統(tǒng)的框架或者表示層來完成.
接下來,在BaseException的基礎(chǔ)之上,還要為應(yīng)用中的每個(gè)層次定義一個(gè)異常基類.例如,業(yè)務(wù)層的異常
可以定義為BusinessException,持久層的異常可以定義為DAOException等.當(dāng)然,這一層次的異常也可以按照
功能或者模塊來進(jìn)行劃分,劃分的方式主要依賴于頂層對異常的處理方法.
最后,就是為每一個(gè)業(yè)務(wù)異常定義相應(yīng)的業(yè)務(wù)對象.另外,為減少異常對象的數(shù)量,在這一層也可以采取錯(cuò)誤
代碼,使得頂層的攔截程序可以依據(jù)錯(cuò)誤代碼來得到相應(yīng)的錯(cuò)誤信息.
異常處理方法
Servlet容器中異常的處理
在web.xml文件中進(jìn)行異常處理的配置是通過<error-page>元素來進(jìn)行的,它支持兩種類型的異常攔截.
<error-page>
<error-code>404</error-code>
<location>/error/notFound.jsp</location>
</error-page>
<error-page>
<error-type>java.lang.NullPointException</error-type>
<location>/error/nullPointer.jsp</location>
</error-page>
從JSP 2.0開始,除了在錯(cuò)誤頁面中可以使用綁定到request的exception對象外,還增加了一個(gè)名稱為
errorData的綁定到pageContext的對象,該對象是javax.servlet.jsp.ErrorData類的實(shí)例,它可以當(dāng)做
一個(gè)普通的Bean來使用,通過它的屬性可以了解到異常的更多信息.
其屬性如下:
屬性 類型 描述
requestURI String 發(fā)生請求失敗的URI
servletName String 發(fā)生錯(cuò)誤的Servlet或者JSP頁面的名稱
statueCode int 發(fā)生錯(cuò)誤的狀態(tài)碼
throwable Throwable 導(dǎo)致當(dāng)前錯(cuò)誤的異常
例如:
...
<title>404狀態(tài)碼錯(cuò)誤的頁面</title>
...
<jsp:useBean id="now" class="java.util.Date" />
發(fā)生異常的時(shí)間:${now}<br>
請求的地址: ${pageContext.errorData.requestURI }<br>
錯(cuò)誤狀態(tài)碼: ${pageContext.errorData.statueCode }<br>
異常: ${pageContext.errorData.throwable }
...
自定義異常頁面
自己在JSP頁面中的定義將會(huì)覆蓋在web.xml中的定義
自定義異常頁面的方法如下
<%@ page errorPage="/error/errorPage.jsp" %>