c# - 什么时候应该使用 ThrowHelper 方法而不是直接抛出?

标签 c# exception throw

什么时候使用ThrowHelper 方法而不是直接抛出是合适的?

void MyMethod() {
    ...
    //throw new ArgumentNullException("paramName");
    ThrowArgumentNullException("paramName");
    ...
}
void ThrowArgumentNullException(string paramName) {
    throw new ArgumentNullException(paramName);
}

我读到调用 ThrowHelper 方法(唯一目的是抛出异常的方法)而不是直接抛出应该产生更小的字节码。

这和明显的封装(另一层间接)可能是不直接抛出的好理由,至少在某些情况下是这样。

无论如何,IMO 的缺点也不是微不足道的。

  • 部分(异常)控制流被隐藏
  • 异常最终会有一个更神秘的堆栈跟踪
  • 编译器 (2.0) 将无法识别 ThrowHelper 调用是方法的退出点,因此需要一些代码绕过。

我有限的经验是,整体设计通常会变得更糟。

int MyMethod(int i) {
    switch (i) {
        case 1:
            return 1;
        default:
            ThrowMyException();
    }
    return 0; // Unreachable (but needed) code
 }

这在一定程度上可能是个人品味问题。无论如何,您对这个问题的个人指导方针是什么?您是否发现将 ThrowHelpers 用于方法参数验证(ThrowArgumentNullException(paramName) 等)等所有常见任务是个好主意? 在这个问题上我是否遗漏了一些明显的东西?

顺便说一句,我尽量不要将此问题与验证问题混为一谈,例如像这样的方法:

ThrowIfNameIsNullOrEmpty(name);

最佳答案

我的默认做法是直接从异常代码分支抛出。

当我将其包装在一个方法中时,DRY 原则和 3 法则指导:如果我发现自己编写相同的“抛出”代码 3 次或更多次,我会考虑将其包装在辅助方法中。

但是,与其使用抛出的方法,不如编写一个创建所需异常然后从原始位置抛出的工厂方法要好得多:

public void DoStuff(string stuff)
{
    // Do something

    throw this.CreateException("Boo hiss!");
}

private MyException CreateException(string message)
{
    return new MyException(message);
}

这会保留堆栈跟踪。

关于c# - 什么时候应该使用 ThrowHelper 方法而不是直接抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1980044/

相关文章:

c# - 为什么我读取成功的Npgsql数据消失了?

c# - 如何从 xaml 中该行中的模板化单元格绑定(bind)到 DataGridRow 项目?

c# - Web API 中的电子邮件确认

c# - 使用 .Number 捕获 mysql 异常

这两个规范的 Python 代码等效

javascript - 如何编写可重用的错误?

c# - 抛出异常后我必须中断吗?

c# - F# 函数与 C# "Func"的对比

java - 编写自定义异常的最佳方法

java - 在 intellij : how can i see the all thrown exceptions? 中调试多线程