什么时候适合使用投掷助手方法而不是直接抛出?
void MyMethod() {
...
//throw new ArgumentNullException("paramName");
ThrowArgumentNullException("paramName");
...
}
void ThrowArgumentNullException(string paramName) {
throw new ArgumentNullException(paramName);
}
我读过,调用投掷助手方法(唯一目的是抛出异常的方法)而不是直接抛出should产生更小的字节码。
这以及明显的封装(另一层间接)可能是不直接抛出的充分理由,至少在某些情况下是如此。
无论如何,在我看来,缺点也并非不严重。
- 的一部分(异常的) 控制流被隐藏
- 异常最终会产生更神秘的堆栈跟踪
- 编译器(2.0)不会识别投掷助手调用是方法的退出点,因此需要一些代码。
我有限的经验是,整体设计通常会变得更糟。
int MyMethod(int i) {
switch (i) {
case 1:
return 1;
default:
ThrowMyException();
}
return 0; // Unreachable (but needed) code
}
这可能部分是个人品味的问题。无论如何,您对这个问题的个人指导方针是什么?你觉得使用它是个好主意吗投掷助手对于所有这些常见任务,例如方法参数验证(ThrowArgumentNullException(参数名称)等等)?
我在这个问题上遗漏了一些明显的东西吗?
顺便说一句,我试图不把这个问题与验证问题,例如像这样的方法:
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);
}
这保留了堆栈跟踪。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)