2011-12-04 55 views
1

我正在关注Fail Fast委托人。我想知道为了检查我的构造函数参数参数是否有适当的Assertion类是好的做法。创建自定义断言类

例如:

public static class Assertions 
{ 
    public static void ParamterIsNotNull(object subject, string paramName = "") 
    { 
     if (subject == null) throw new ArgumentNullException(paramName, "Paramter cannot be null"); 
    } 
} 

,并在使用中:

public class Test 
{ 
    public Test(object obj) 
    { 
     Assertions.ParamterIsNotNull(obj, "obj"); 
    } 
} 

是来卸载异常抛出到另一类好的做法,还是不如直接抛出异常的构造函数?

回答

1

从我读过的内容(在文章的最后),马丁说,做两件事情都很好 - 快速失败,提供有意义的例外和“慢速失败” - 让用户具备触目惊心的联系方式支持并继续完成可以成功完成的任务,无论例外情况如何。

在这种情况下,批处理系统示例非常好 - 虽然批处理中的1项可能会令人失望,但用户最可能希望剩下的部分处于隐患状态,这就是为什么您抛出全局捕获的异常处理程序(全局处理程序决定继续处理下一个项目并汇总错误,以便将其显示给用户并发送通知给开发团队)。

这种方式都完成了 - 大多数用户的工作已经完成,快速失败原则也被触发。

所以它取决于你的具体情况 - 也许如果你的类参与了其他操作,将会有更多的全局类(或使用它的调用者类)能够更好地决定它是否可以继续。

另一方面 - 你的类不应该能够告诉调用类是否可以在失败的情况下做一些其他的工作,所以你需要抛出你的异常在构造函数中,是的。 这是我认为 - 是:)。所以,如果你的班级代表批量的一个项目 - 调用者很可能会捕获异常并继续。如果它是某种入口点类的话 - 那么你可能希望优雅地处理异常(或者根本不要抛出它),向用户显示错误消息并提供开发团队的细节(日志)以便于说明问题出在哪里。