在C#中抛出异常,保护代码

5

今天我参与了一个有关重构(#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更简单,只需要基本的C#知识,而不需要Util库的知识。
  2. #1不会删除重命名传递给ArgumentNullException构造函数的字符串的resharper功能。
  3. #2将增加代码的依赖性(必须访问包含dll的dll)。
  4. #2的堆栈跟踪与#1不同。
我的问题是: 我的直觉正确吗? 从另一个程序集抛出异常是否可能在某些情况下成为麻烦?

你可以配置R#来生成你的自定义“Guard”语句。效果非常好,甚至比以前更好。 - astef
那么在#2中减少代码嵌套,从而提高可读性如何? - astef
2个回答

3
您可以从#2中受益,以在多个项目之间标准化异常处理;该抽象还使得库能够在后期进行增强和重新分发,例如错误日志记录等。

1
对于这种情况,你不应该使用Guard,而应该使用代码合约(Code Contracts)。
Contract.Requires(myArgument != null);

这个在发布版本中真的会和上面的代码一样运行吗? - Casper Leon Nielsen
@Casper Leon Nielsen:是的,你可以设置它来这样做。 - jason
1
有人应该说,代码契约是一个糟糕的想法,支持实现不佳,并且让在真实项目中使用它超过两周的每个人都感到沮丧。 - astef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接