多层体系结构中的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,比如PersonManagementBean
、OrganizationManagementBean
、EmployeeManagementBean
,以及相应的@local
和@remote
接口。它们向客户机公开,即实际上它们是会话外观(因此它们位于服务层)。因此,最好为每个bean创建相应的异常类(PersonManagementException
,OrganizationManagementException
,EmployeeManagementException
)
或者最好只有一个名为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
,其中包含关于哪些对象未通过验证规则的信息)
# 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 楼答案
对于发出故障信号的任何异常,请仅使用一个异常。理由:在这种情况下,客户端除了记录stacktrace和/或向用户报告错误外,无法执行任何操作
在某些特殊情况下,您需要抛出一个异常,以表明需要一种替代方法来服务请求只有这些情况需要特定的异常
远程客户端几乎不想知道发生故障以外的任何事情;请非常小心,不要让冗余的异常类给远程接口增加负担