有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

一,。我是否需要创建一个泛型异常,比如PersistentException,并使所有DAO类方法只抛出一种类型的异常PersistentException?也就是说,在每个DAO方法(CRUD)中,执行以下操作:

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

二,。是否可以为每个EJB服务创建一个异常类(每个EJB接口一个异常)

也就是说,假设我有一个EJB bean,比如PersonManagementBeanOrganizationManagementBeanEmployeeManagementBean,以及相应的@local@remote接口。它们向客户机公开,即实际上它们是会话外观(因此它们位于服务层)。因此,最好为每个bean创建相应的异常类(PersonManagementExceptionOrganizationManagementExceptionEmployeeManagementException

或者最好只有一个名为ServiceException的异常(如DAO)

三,。什么类型的异常会导致我的服务(繁忙)级别(在常见情况下)?我可以将DAO(PersistentException)异常传播到客户端吗?i、 e

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) 个答案

  1. # 1 楼答案

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

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

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

    在处理例外情况时,不要忘记“早扔晚捕”

  2. # 2 楼答案

    对于发出故障信号的任何异常,请仅使用一个异常。理由:在这种情况下,客户端除了记录stacktrace和/或向用户报告错误外,无法执行任何操作

    在某些特殊情况下,您需要抛出一个异常,以表明需要一种替代方法来服务请求只有这些情况需要特定的异常

    远程客户端几乎不想知道发生故障以外的任何事情;请非常小心,不要让冗余的异常类给远程接口增加负担