2013-01-18 108 views
1

我有一个三轮架构的应用程序。我不明白如何在这种情况下处理异常。我收集了一些问题:多层架构中的异常处理最佳实践

1。我是否需要创建一个通用异常,如PersistentException,并使所有DAO类方法只抛出一种类型 - PersistentException?即在每个DAO方法(CRUD)内部都这样做:

public create(Entity instance) { 
     try { 
     ...// all operations here 
     } catch(Exception e) { 
      throw new PersistentException(e); 
     } 
    } 

2。每个 EJB服务创建一个的异常类是可以的(每个EJB接口有一个异常)?

I.e.假设我有一个EJB豆状PersonManagementBeanOrganizationManagementBeanEmployeeManagementBean相应@local@remote接口。它们暴露给客户,即事实上它们是会话外观(所以它们位于服务层)。所以最好为每个bean创建相应的Exception类(PersonManagementException,OrganizationManagementException,EmployeeManagementException)?

或者最好是只叫ServiceException(如DAO中的情况下)一个例外?

3。哪种类型的例外可能会导致我的服务(繁忙)级别(,通常情况下为)?我可以将DAO(PersistentException)异常传播给客户吗?即

public void relocatePerson() { 
    try { 
     Person p = personDao.getPerson(); // can throw PersistentException 
     .... 
     if (someCondition) { 
     throw new PersonManagementException(); // throwing same PersonManagementException 
     } 
     .... 
    } catch(PersonManagementException e) { 
     throw e; //don't need to rewrap same exception 
    } catch(PersistentException e) { 
     throw e; // DO I need to throw it as PersistentException to client? Or it's better to rewrap it as PersonManagementException? 
    } catch(Exception e) { 
     throw new PersonManagementException(e) //throwing all exception as service specific exception 
    } 

} 

或者我需要重新抛出所有异常(通常情况下)作为特定于服务的异常?

  • “在通常情况下”我的意思是,我知道,在某些情况下,一些方法可以抛出其他例外有一些有用的信息(例如ValidationException与有关哪些对象没有通过验证规则)

回答

0

是的,你应该让所有的DAO类的方法来exeption抛出只有一种类型的 - PersistentException。因为它可以帮助您将各种与DB有关的异常捕获到1种类型中。此外,您可以设置有关特定异常的消息,同时使用参数化构造函数将其设置为PersistantException。 i.e. throw new PersistentException("Exception while opening a connection",e);

你的第二个问题,完全取决于您的要求。如果你想显示不同的错误并显示不同的错误页面,并且想分别处理它们(每个bean的错误),那么你应该为每个bean创建单独的异常类。

你的第三个问题,按照我的观点的细点。您可以将PersistentException传播到首先调用DAO或Helpers的级别 - 即ActionBean或servlet。 在那里,你可以设置你的错误信息,然后你可以将它们扔在您的架构级别的处理程序(这是在构造或XML文件配置)

虽然有例外的工作不要忘记,“早扔,赶上末”

0

对于信号失败任何异常,只使用一个例外。理由:在这种情况下,客户端无法做任何事情,但记录堆栈跟踪和/或向用户报告错误。

我需要抛出异常的一些特殊情况只是为了表示需要另一种服务请求的方法。 只有这些案例需要特定的例外

远程客户端几乎从不想知道发生故障的其他事情; 非常小心不要让您的远程接口受到冗余异常类的影响。

+0

好的,谢谢。但是,你能否更深入地解释一下这个词:“非常小心,不要用冗余异常类来增加远程接口的负担。如果我的每个远程方法都会被标记为“抛出MyExecption”?什么与它?什么类型的异常必须由EJB抛出 - 检查或未检查的异常?谢谢 – MyTitle

+0

您声明的所有异常都必须包含在客户端JAR依赖项中。如果他们没有带来商业价值,他们只是自重。由于所有的EJB异常都必须扩展'RemoteException',因此在checked和unchecked之间没有选择。 –

+0

你确定吗?我认为扩展'RemoteException'并不是强有力的要求(至少在EJB 3.0中)。我有扩展'Exception'的经验,而不是'RemoteException'。 – MyTitle