2

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

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,例如PersonManagementBean, OrganizationManagementBeanEmployeeManagementBean具有相应的@local@remote接口。它们暴露给客户端,即实际上它们是会话外观(因此它们位于服务层)。所以为每个 bean ( PersonManagementException, OrganizationManagementException, EmployeeManagementException) 创建相应的异常类是个好主意吗?

或者最好只调用一个异常ServiceException(如 DAO 的情况)?

3. 什么类型的异常可以抛出我的服务(繁忙)级别(通常情况下)?我可以将 DAO ( PersistentException) 异常传播给客户端吗?IE

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有关哪些对象未通过验证规则的信息)
4

2 回答 2

0

For any exception that signals failure, use just one exception. Rationale: the client can't do anything in this case but log the stacktrace and/or report the error to the user.

I some special circumstances you'll need to throw an exception just to signal that an alternative approach to serving the request is needed. Only these cases need a specific exception.

The remote client will almost never want to know anything else than that a failure occurred; be very careful not to burden your remote interface with redundant exception classes.

于 2013-01-18T14:02:16.620 回答
0

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

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

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

在处理异常时不要忘记“早扔,晚赶”

于 2013-01-18T13:54:59.307 回答