首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

EJB 异常处理的最佳做法(2)EJB 容器怎样处理异常

EJB 异常处理的最佳做法(2)EJB 容器怎样处理异常

EJB 容器怎样处理异常EJB 容器拦截 EJB 组件上的每一个方法调用。结果,方法调用中发生的每一个异常也被 EJB 容器拦截到。EJB 规范只处理两种类型的异常:应用程序异常和系统异常。
EJB 规范把        应用程序异常定义为在远程接口中的方法说明上声明的任何异常(而不是         RemoteException )。应用程序异常是业务工作流中的一种特殊情形。当这种类型的异常被抛出时,客户机会得到一个恢复选项,这个选项通常是要求以一种不同的方式处理请求。不过,这并不意味着任何在远程接口方法的         throws 子句中声明的非受查异常都会被当作应用程序异常对待。EJB 规范明确指出,应用程序异常不应继承         RuntimeException 或它的子类。      
当发生应用程序异常时,除非被显式要求(通过调用关联的         EJBContext 对象的         setRollbackOnly() 方法)回滚事务,否则 EJB 容器就不会这样做。事实上,应用程序异常被保证以它原本的状态传送给客户机:EJB 容器绝不会以任何方式包装或修改异常。      
系统异常被定义为受查异常或非受查异常,EJB 方法不能从这种异常恢复。当 EJB 容器拦截到非受查异常时,它会回滚事务并执行任何必要的清理工作。接着,它把该非受查异常包装到         RemoteException 中,然后抛给客户机。这样,EJB 容器就把所有非受查异常作为         RemoteException (或者作为其子类,例如         TransactionRolledbackException )提供给客户机。      
对于受查异常的情况,容器并不会自动执行上面所描述的内务处理。要使用 EJB 容器的内部内务处理,您将必须把受查异常作为非受查异常抛出。每当发生受查系统异常(如         NamingException )时,您都应该通过包装原始的异常抛出         javax.ejb.EJBException 或其子类。因为         EJBException 本身是非受查异常,所以不需要在方法的         throws 子句中声明它。EJB 容器捕获         EJBException 或其子类,把它包装到         RemoteException 中,然后把         RemoteException 抛给客户机。      
虽然系统异常由应用程序服务器记录(这是 EJB 规范规定的),但记录格式将因应用程序服务器的不同而异。为了访问所需的统计信息,企业常常需要对所生成的日志运行 shell/Perl 脚本。为了确保记录格式的统一,在您的代码中记录异常会更好些。
:EJB 1.0 规范要求把受查系统异常作为         RemoteException 抛出。从 EJB 1.1 规范起规定 EJB 实现类绝不应抛出         RemoteException 。
返回列表