是否存在异常处理标准?如果是,请提供链接

时间:2011-04-02 15:01:26

标签: c# .net exception-handling

我正在开发一个代码块,由前一个开发人员编写,他不喜欢处理异常!

我想知道我是否能找到任何关于异常处理的指南。

例如:假设有一个方法负责在数据库中执行查询,如果连接失败,那么它应该向调用者抛出相同的异常吗?或者它应该只处理它并记录它并返回false(意味着失败)。

我知道这个问题似乎是主观的,我只想要任何资源,指南或标准来处理异常。

问候。

2 个答案:

答案 0 :(得分:5)

如果您询问10位开发人员,您可能会得到10个不同的答案。我所遵循的一般经验法则是,异常处理应该是标准化的,并且不会在每种方法中重复。我试图以一致的方式争取每层处理一次异常。

因此,在标准的3层体系结构(表示,业务,数据)中,每层都有一个标准的异常处理机制,所有这三种机制都会在后台调用相同的日志/通知/等。< / p>

以下是指向Microsoft's Best Practices的链接。

答案 1 :(得分:3)

异常处理是“关注点分离”中的一个“问题”,因此它不应该散布在您的应用程序中并与您的核心业务逻辑混合在一起。这个领域可能会以不同于您的业务逻辑的速度发展。

例如,您提到打开数据库连接。您可以从记录异常开始,但稍后您可能会确定它应该在超时时自动重试,或者发送警报,或者可能适合实施Circuit Breaker Pattern

遵循单一责任原则和关注点分离使您能够独立发展您的异常处理行为。考虑一下这个界面:

public interface IConnectionFactory
{
    IConnection Create();
}

如果您在基本实现中没有进行任何异常处理,那么您可以使用继承,装饰器模式或框架的某些功能来添加其他行为。

public class RetryOnTimeoutConnectionFactory { ... }
public class CircuitBreakerConnectionFactory { ... }

要考虑的另一件事是背景。你提到这是web服务。好吧,如果您遵循REST语义,您可能会将异常转换为HTTP状态代码,具体取决于异常的分类。如果您将异常捕获到较低级别并静默返回false,那么您真的会给自己戴上手铐。