【问题标题】:Exception handling in Struts 2 and HibernateStruts 2 和 Hibernate 中的异常处理
【发布时间】:2013-02-13 11:06:35
【问题描述】:

假设我们在 Struts 2、Hibernate、MySQL 中开发了一个网站,并且我们在此处添加了几个 try/catch 块,这些块包含通过 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。

【问题讨论】:

    标签: java hibernate exception struts2


    【解决方案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>
    

    【讨论】:

      【解决方案2】:

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

      应该记录特定的异常。用户应该看到操作失败。通常,您要么通过正常的 S2 方式简单地报告这一点,例如,一条错误消息。

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

      可以使用声明性异常处理来处理任何或所有低级异常,但 IMO 要么太笼统,要么太乏味。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-17
        • 2013-04-15
        • 2014-11-02
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多