2009-07-31 153 views
2

我對如何在Struts2中處理錯誤有點困惑。如果發生錯誤,我希望將一次中央頁面作爲用戶定向的地方。此外,當發生錯誤時,我希望記錄它,因爲我使用的是log4j,所以我將它記錄爲log.error(e.getMessage(), e);Struts2中的錯誤處理

但是,在我的動作類中,如果我發現錯誤(將所有代碼放入try/catch中)那麼中央/通用錯誤頁面不會出現。所以我決定不要捕捉錯誤,如果我不抓住錯誤,那麼中央錯誤頁面出現。但是現在我怎麼把錯誤消息/ stacktrack放入日誌?

閱讀本link 我做了以下後:

<global-results> 
        <result name="Exception" type="chain"> 
         <param name="actionName">ErrorPage</param> 
        <param name="namespace">/error</param> 

        </result> 
      </global-results> 

      <global-exception-mappings> 
       <exception-mapping exception="java.lang.Exception" result="Exception"/> 
      </global-exception-mappings> 
      <action name="selectionPage" class="reports.ReportSelection"> 
       <result>/reports/SelectionPage.jsp</result> 
      </action> 

    </package> 
    <package name="secure" namespace="/error"> 
     <action name="ErrorPage" class="com.myErrorClass"> 
      <result>errorpage.jsp</result> 
     </action> 
    </package> 

根據上面的配置,原先的錯誤是在reports.ReportSelection拋出(但我沒有抓住它有)所以最後的控制來com.myErrorClass。我可以在這個類中記錄錯誤,但我的問題是,日誌消息是否仍然可用...因爲它最初是在reports.ReportSelection中拋出的?

回答

1

當你捕捉並記錄它後,你是在重新渲染它嗎?如果這樣做,那麼框架例外管理應該踢你的錯誤處理代碼應該是這個樣子:在地方

catch (Exception e) { 
    log.error(e.getMessage(), e); 
    throw e; 
} 

有了,你應該能夠回到你簡化採伐方式和retrhowing它操作類和配置單個全局錯誤頁面。

6

這裏是你如何記錄你的動作拋出的錯誤。我不知道爲什麼這是默認打開的。把它放在你的struts.xml文件中。

<interceptors> 
     <interceptor-stack name="errorloggingStack"> 
      <interceptor-ref name="defaultStack"> 
      <param name="exception.logEnabled">true</param> 
      <param name="exception.logLevel">ERROR</param> 
     </interceptor-ref> 
     </interceptor-stack> 
    </interceptors> 

    <default-interceptor-ref name="errorloggingStack"/> 

您不需要圍繞每個操作方法都有try-catch塊。

0

作爲替代方案,你也可以 「覆蓋」 的defaultStack攔截器棧

<interceptors> 
    <interceptor-stack name="defaultStack"> 
     <interceptor-ref name="defaultStack"/> 
     <interceptor-ref name="exception"> 
      <param name="logEnabled">true</param> 
      <param name="logLevel">WARN</param> 
     </interceptor-ref> 
    </interceptor-stack> 
</interceptors>