快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
方法删除某个客户在特定日期前所下的全部订单。首先,它获取 OrderEJB 的 Home 接口。接着,它取回某个特定客户的所有订单。当它碰到在某个特定日期之前所下的订单时,就删除所订购的商品,然后删除订单本身。请注意,抛出了三个异常,显示了三种常见的异常处理做法。(为简单起见,假设编译器优化未被使用。)

清单 1. 三种常见的异常处理做法

100 try { 101  OrderHome homeObj = EJBHomeFactory.getInstance().getOrderHome(); 102  Collection orderCollection = homeObj.findByCustomerId(id); 103  iterator orderItter = orderCollection.iterator(); 104  while (orderIter.hasNext()) { 105   Order orderRemote = (OrderRemote) orderIter.getNext(); 106   OrderValue orderVal = orderRemote.getValue(); 107   if (orderVal.getDate() < "mm/dd/yyyy") { 108    OrderItemHome itemHome =         EJBHomeFactory.getInstance().getItemHome(); 109    Collection itemCol = itemHome.findByOrderId(orderId) 110    Iterator itemIter = itemCol.iterator(); 111    while (itemIter.hasNext()) { 112     OrderItem item = (OrderItem) itemIter.getNext(); 113     item.remove(); 114    } 115    orderRemote.remove(); 116   } 117  } 118 } catch (NamingException ne) { 119  throw new EJBException("Naming Exception occurred"); 120 } catch (FinderException fe) { 121  fe.printStackTrace(); 122  throw new EJBException("Finder Exception occurred"); 123 } catch (RemoteException re) { 124  re.printStackTrace(); 125  //Some code to log the message 126  throw new EJBException(re); 127 }

现在,让我们用上面所示的代码来研究一下所展示的三种异常处理做法的缺点。

抛出/重抛出带有出错消息的异常

NamingException 可能发生在行 101 或行 108。当发生 NamingException 时,这个方法的调用者就得到 RemoteException 并向后跟踪该异常到行 119。调用者并不能告知 NamingException 实际是发生在行 101 还是行 108。由于异常内容要直到被记录了才能得到保护,所以,这个问题的根源很难查出。在这种情形下,我们就说异常的内容被“吞掉”了。正如这个示例所示,抛出或重抛出一个带有消息的异常并不是一种好的异常处理解决办法。

记录到控制台并抛出一个异常

FinderException 可能发生在行 102 或 109。不过,由于异常被记录到控制台,所以仅当控制台可用时调用者才能向后跟踪到行 102 或 109。这显然不可行,所以异常只能被向后跟踪到行 122。这里的推理同上。

包装原始的异常以保护其内容

RemoteException 可能发生在行 102、106、109、113 或 115。它在行 123 的 catch 块被捕获。接着,这个异常被包装到 EJBException 中,所以,不论调用者在哪里记录它,它都能保持完整。这种办法比前面两种办法更好,同时演示了没有日志策略的情况。如果 deleteOldOrders() 方法的调用者记录该异常,那么将导致重复记录。而且,尽管有了日志记录,但当客户报告某个问题时,产品日志或控制台并不能被交叉引用。

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

时间:2011-02-05 IBM Srikanth Shenoy

EJB 异常处理探试法

EJB 组件应抛出哪些异常?您应将它们记录到系统中的什么地方?这两个问题盘根错结、相互联系,应该一起解决。解决办法取决于以下因素:

您的 EJB 系统设计:在良好的 EJB 设计中,客户机绝不调用实体 EJB 组件上的方法。多数实体 EJB 方法调用发生在会话 EJ

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号