2013-02-13 51 views
1

假設我們已經在Struts2,Hibernate,MySQL中開發了一個網站,並且我們添加了幾個塊,這裏是通過Hibernate包含數據庫調用的地方。我的問題是在Struts 2和Hibernate中的異常處理

  1. 在catch塊內,我發送適當的消息給記錄器。在這裏,我們不能使用System.out.println作爲網頁,還有什麼可以做到提醒用戶有關異常?

  2. 作爲測試的一部分,我更改了hibernate.cfg.xml並輸入了錯誤的數據庫密碼以模擬數據庫崩潰情況。

如我所料它扔錯誤

javax.servlet.ServletException: Filter execution threw an exception 

    java.lang.NoClassDefFoundError: com_cenqua_clover/CoverageRecorder 
    my.com.employee.<init>(employee.java:29) 
    com.action.employeeAction.<init>(employeeAction.java:23) 
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    java.lang.Class.newInstance0(Class.java:355) 
    java.lang.Class.newInstance(Class.java:308) 
    com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:119) 
    com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:150) 
    com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:139) 
    com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:109) 
    com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:288) 
    com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:388) 
    com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:187) 
    org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61) 
    org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39) 
    com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47) 
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:478) 
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395) 
    note The full stack trace of the root cause is available in the Apache Tomcat/7.0.20 logs. 

,並從用戶的角度來看,這是不可取的權利,所以如何解決這些問題。我使用Eclipse Juno,Windows XP,MySQL 5.5。

回答

1

用戶不需要知道有一個數據庫異常,開發人員。

應該記錄特定的異常。用戶應該看到操作失敗。一般而言,您只需通過正常的S2方式報告,例如錯誤消息。

您也可以拋出特定於應用程序的異常並使用S2的聲明式異常處理。

可能使用聲明式異常處理來處理任何或所有低級異常,但是IMO過於籠統或太乏味。

1

異常是程序的結果或開發人員無法處理異常行爲的情況。在這種情況下,開發人員可能知道拋出異常,並可能採取一些行動來解決案件。

普通用戶不需要知道任何異常,但系統管理員實際上是這樣做的。所以,日誌記錄異常很好,可以進一步解決任何問題。

當開發人員需要通過打印堆棧跟蹤,重新拋出異常來調試問題時,這對開發階段也很有用。在這種情況下很少適用捕捉和忽略例外。

在正常情況下應該捕獲,記錄和重新排除異常。但在Struts2的,你可以通過創建默認的應用程序攔截器棧

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

任何 例外不受該申請者將被記錄,然後處理未捕獲的異常,由全局異常映射處理

<global-exception-mappings> 
    <exception-mapping exception="java.lang.Exception" result="error"/> 
</global-exception-mappings> 

<global-results> 
    <result name="error">/error_page.jsp</result> 
</global-results>