Struts 2和Hibernate中的异常处理

时间:2013-02-13 11:06:36

标签: java hibernate exception exception-handling struts2

假设我们已经在Struts2,Hibernate,MySQL中开发了一个网站,我们在这里添加了几个try/catch块,它们通过Hibernate包含数据库调用。我的问题是

  1. 在catch块中,我正在向记录器发送适当的消息。在这里,我们不能将System.out.println用作其网页,还可以采取哪些措施来提醒用户异常?

  2. 作为测试的一部分,我更改了hibernate.cfg.xml并输入了错误的数据库密码,以便模拟数据库崩溃情况。

  3. 正如我预期的那样引发了错误

        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。

2 个答案:

答案 0 :(得分:2)

异常是程序或开发人员无法处理异常行为的结果。在这种情况下,开发人员可以知道抛出异常并可以采取一些措施来解决案例。

普通用户不需要知道任何异常,但系统管理员实际上是这样做的。因此,记录异常很有可能进一步解决任何问题。

这在开发阶段也很有用,当开发人员需要通过打印stacktrace调试问题时,重新抛出异常。在这种情况下很少适用捕捉和忽略的例外情况。

在正常情况下,应该捕获,记录和重新抛出异常。但是在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>

答案 1 :(得分:1)

用户不需要知道开发人员有数据库异常。

应记录特定的例外情况。用户应该看到操作失败。通常,您只需通过正常的S2方式报告此情况,例如错误消息。

您还可以抛出特定于应用程序的异常并使用S2的声明性异常处理。

可以使用声明性异常处理来处理任何或所有低级别异常,但IMO要么过于笼统,要么过于繁琐。