我应该抛出异常来处理装饰模式中的验证吗?

时间:2013-08-05 15:50:21

标签: c# exception decorator

这有点像设计问题。我正在使用装饰器模式来处理横切问题。其中一个问题是验证。我见过的大多数例子都是这样的:

IAccount account = new AccountValidator(new Account());
account.Deposit();

并且验证器的实现类似于:

if (!IsValid)
    throw new NotValidException();

过于简单化,但希望你明白这一点。

我的印象是这是不好的做法(我可能是错的,这真的是我问题的核心 - 这是一种不好的做法吗?)这种情况并非如此。这是一个相当典型且易于理解的用户输入错误。

但是,我知道如何避免这种情况的唯一方法是设计我的所有服务方法以返回某种包含响应数据的标准化对象。例如,account.Deposit()返回一个IResponse,它由许多可能的类实现,例如NotValidResponse:IResponse ...

思想?

1 个答案:

答案 0 :(得分:1)

不应使用例外来控制数据流;它们应该用于特殊情况。我建议你按照你所描述的那样返回某种Result对象,或者bool,或者其他方式。您不应该使用异常来确定应用程序行为:对于需要维护代码的其他程序员来说,它们很昂贵且不直观。

我强烈推荐Erip Lippert关于这个主题的不朽词语:http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx