除了錯(cuò)誤處理機(jī)制以外,一個(gè)表示層框架必須提供本地異常信息的顯示和反饋機(jī)制。一個(gè)可行的方式是捕獲實(shí)際的異常和錯(cuò)誤內(nèi)容到日志文件中然后發(fā)送一個(gè)有意義的信息幫助用戶決定適當(dāng)?shù)牟僮鳌T趈sp中沒有捕獲的異常,都將由jsp1.2規(guī)范定義的錯(cuò)誤頁面機(jī)制處理。類似的,在servlets中沒有處理的異常將由web.xml定義的errorpage屬性處理。struts提供了一個(gè)簡單的機(jī)制,這個(gè)機(jī)制使用相同的錯(cuò)誤頁面機(jī)制處理jsp和servlet容器的未處理的異常。struts-config.xml文件例子略。
異常處理機(jī)制是建立在錯(cuò)誤處理機(jī)制的基礎(chǔ)上的,因此也是使用消息資源提供本地消息信息。下面的圖示解釋了struts涉及到異常處理機(jī)制的類關(guān)系。
分派的角色
就像在RequestProcessor一節(jié)討論的一樣,request processor調(diào)用request handler的execute方法。任何request handler拋出的異常都被RequestProcessor捕獲然后在strutsconfig.xml中找到可能的
異常處理AppException
在request handlers中這是一個(gè)創(chuàng)建exceptions的基類。它封裝了異常發(fā)生原因?qū)傩裕ǎ┖拖嚓P(guān)的ActionError對(duì)象。一個(gè)AppException的子類可以提供合適的構(gòu)造函數(shù),通過可選的屬性名和對(duì)象參數(shù),用消息key正確初始化對(duì)象。消息key可以從和異常對(duì)應(yīng)的ExceptionConfig對(duì)象中獲得。涉及到AppException的API是構(gòu)造函數(shù)列表(可以被子類調(diào)用),AppException作為ExceptionHandler.execute的方法參數(shù)傳遞的。
轉(zhuǎn)換異常到ActionErrors中
RequestProcessor查詢ExceptionConfig的異常處理定義。RequestProcessor創(chuàng)建特定的ExceptionHandler并調(diào)用它的execute方法并傳AppException作為參數(shù)。org.apache.struts.action.ExceptionHandler的一個(gè)默認(rèn)的異常處理是預(yù)先配置在ExceptionConfig對(duì)象中的。ExceptionHandler從AppException對(duì)象獲得ActionError對(duì)象,然后根據(jù)ErrorsTag創(chuàng)建ActionErrors對(duì)象使用。如果異常不是AppException類或其繼承類,ExceptionHandler會(huì)用定義的