清单 5. LoggableEJBException — EJBException 的一个子类

public class LoggableEJBException extends EJBException {

protected boolean isLogged;

protected String uniqueID;


public LoggableEJBException(Exception exc) {

super(exc);

isLogged = false;

uniqueID = ExceptionIDGenerator.getExceptionID();

}


..

..

}

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


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

清单 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);

     }

}