【发布时间】:2010-12-31 02:30:32
【问题描述】:
什么时候适合使用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);
【问题讨论】:
-
哇。我以前没有见过这种模式,但和你一样,我的直接反应是非常消极的。对于绝大多数情况,字节码大小肯定是过早的优化。
-
微软在设计 Stack
时使用了 ThrowHelper:pastebin.com/p2k4URtU