快速业务通道

EJB异常处理的最佳做法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
Exception exc) {    super(exc);    isLogged = false;    uniqueID = ExceptionIDGenerator.getExceptionID();    }    ..    .. }

EJB异常处理的最佳做法(6)

时间:2011-02-05 IBM Srikanth Shenoy

类 LoggableEJBException 有一个指示符标志( isLogged ),用于检查异常是否已经被记录了。每当捕获一个 LoggableEJBException 时,看一下该异常是否已经被记录了( isLogged == false )。如果 isLogged 为 false,则记录该异常并把标志设置为 true 。

ExceptionIDGenerator 类用当前时间和机器的主机名为异常生成唯一的标识。如果您喜欢,也可以用有想象力的算法来生成这个唯一的标识。如果您在实体 EJB 组件中记录了异常,则这个异常将不会在别的地方被记录。如果您没有记录就在实体 EJB 组件中抛出了 LoggableEJBException ,则这个异常将被记录到会话 EJB 组件中,但不记录到 Web 层中。

单 6 显示了使用这一技术重写后的清单 4。您还可以继承 LoggableException 以适合于您的需要(通过给异常指定错误代码等)。

清单 6. 使用 LoggableEJBException 的异常处理

try {    OrderHome orderHome = EJBHomeFactory.getInstance().getOrderHome();    Order order = orderHome.findByPrimaryKey(Integer id); } catch (NamingException ne) {    throw new LoggableEJBException(ne); } catch (SQLException se) {    throw new LoggableEJBException(se); } catch (RemoteException re) {    Throwable t = re.detail;    if (t != null && t instanceof Exception) {     throw new LoggableEJBException((Exception) re.detail);    } else {     throw new LoggableEJBException(re);    } }

记录 RemoteException

会话 EJB 组件中的系统异常

如果您决定记录会话 EJB 异常,请使用 清单 7所示的记录代码;否则,请抛出异常,如 清单 6所示。您应该注意到,会话 EJB 组件处理异常可有一种与实体 EJB 组件不同的方式:因为大多数 EJB 系统都只能从 Web 层访问,而且会话 EJB 可以作为 EJB 层的虚包,所以,把会话 EJB 异常的记录推迟到 Web 层实际上是有可能做到的。

从清单 6 中,您可以看到 naming 和 SQL 异常在被抛出前被包装到了 LoggableEJBException 中。但 RemoteException 是以一种稍有不同 ― 而且要稍微花点气力 ― 的方式处理的。它之所以不同,是因为在 RemoteException 中,实际的异常将被存储到一个称为 detail (它是 Throwable 类型的)的公共属性中。在大多数情况下,这个公共属性保存有一个异常。如果您调用 RemoteException 的 printStackTrace ,则除打印 detail 的堆栈跟踪之外,它还会打印异常本身的堆栈跟踪。您不需要像这样的 RemoteException 的堆栈跟踪。

为了把您的应用程序代码从错综复杂的代码(例如 RemoteException 的代码)中分离出来,这些行被重新构造成一个称为 ExceptionLogUtil 的类。有了这个类,您所要做的只是每当需要创建 LoggableEJBException 时调用 ExceptionLogUtil.createLoggableEJBException(e) 。请注意,在清单 6 中,实体 EJB 组件并没有记录异常;不过,即便您决定在实体 EJB 组件中记录异常,这个解决方案仍然行得通。清单 7 显示了实体 EJB 组件中的异常记录:

清单 7. 实体 EJB 组件中的异常记录

try {    OrderHome orderHome = EJBHomeFactory.getInstance().getOrderHome();    Order order = orderHome.findByPrimaryKey(Integer id); } catch (RemoteException re) {    LoggableEJBException le =     ExceptionLogUtil.createLoggableEJBException(re);    String traceStr = Stack

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号