在c#中抛出异常,守卫

时间:2011-07-25 17:16:11

标签: c# exception

我今天讨论了重构这个问题(#1)

public void MyFunc(object myArgument)
{
    if(myArgument == null)
        throw new ArgumentNullException("myArgument");
....

有了这个(#2)

//inside a shared assembly in a class called Guard
public static void AgainstArgumentNull(object obj, string message)
{
    if (obj == null)
        throw new ArgumentNullException(message);
}

public void MyFunc(object myArgument)
{
    Guard.AgainstArgumentNull(myArgument, "myArgument");
....

我的直觉是#1因为以下原因而更好:

  1. #1比#2更简单,因为它不需要熟悉Util库,只需要基本的c#知识
  2. #1不会删除resharper重命名传递给ArgumentNullException构造函数的字符串的能力。
  3. #2会增加代码的依赖关系(必须能够访问包含dll的dll)
  4. #2的堆栈跟踪与#1
  5. 的堆栈跟踪不同

    我的问题是: 我的直觉是否正确? 我们从另一个程序集中抛出异常的事实在某些情况下不会成为麻烦吗?

2 个答案:

答案 0 :(得分:3)

您还可以从#2中受益,在多个项目中在某种程度上标准化您的异常处理;抽象还使库能够在后一时间得到增强并重新分配,例如例如,错误记录。

答案 1 :(得分:1)

对于这种特殊情况,您不应该使用Guard。您应该使用代码合同。

Contract.Requires(myArgument != null);