异常处理多层体系结构中的最佳实践

时间:2013-01-18 13:29:07

标签: c# java design-patterns multi-tier three-tier

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

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

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

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

即。假设我有一个EJB bean,如PersonManagementBeanOrganizationManagementBeanEmployeeManagementBean,带有相应的@local@remote接口。它们暴露给客户端,即实际上它们是会话外观(因此它们位于服务层中)。因此,为每个bean(PersonManagementExceptionOrganizationManagementExceptionEmployeeManagementException)创建相应的Exception类是个好主意吗?

或者最好只有一个名为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,其中包含哪些对象未通过验证规则的信息)

2 个答案:

答案 0 :(得分:0)

是的,你应该让所有DAO类方法只抛出一种类型的{ - 1}}。因为它可以帮助您将每种类型的DB相关异常捕获为1种类型。此外,您可以使用参数化构造函数将其设置为PersistantException,从而设置有关特定异常的消息。 PersistentException

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

你的第三个问题,根据我的观点,它的罚款。您可以将PersistentException传播到首先调用DAO或Helper的级别 - 即ActionBean OR servlet。 在那里,您可以设置错误消息,然后将它们抛给您的架构级处理程序(通常在配置或xml文件中配置)

在处理异常情况时,不要忘记"尽早退出并赶上#34;

答案 1 :(得分:0)

对于发出失败信号的任何异常,请仅使用一个例外。基本原理:客户端在这种情况下无法执行任何操作,但请记录堆栈跟踪和/或向用户报告错误。

在某些特殊情况下,您需要抛出异常只是为了表明需要另一种方法来提供请求。 只有这些案例需要特定的例外

远程客户端几乎从不想知道发生故障的其他事情; 非常小心不要使用冗余异常类给远程接口带来负担。