在 C# 中,throw ex
几乎总是错误的,因为它会重置堆栈跟踪。
我只是想知道,这在现实世界中有什么用吗?我能想到的唯一原因是隐藏封闭库的内部结构,但这是一个非常薄弱的理由。除此之外,我在现实世界中从未遇到过。
编辑:我的意思是throw ex
,就像抛出被捕获但堆栈跟踪为空的完全相同的异常,就像做错了一样。我知道 throw ex 必须作为一种语言构造存在,以允许抛出不同的异常(throw new DifferentException("ex as innerException", ex)
),我只是想知道是否存在任何一种情况throw ex
没有错。
最佳答案
我从未见过它是有意使用的,但这当然没有任何意义。
让我们看看替代方案:
catch(Exception ex)
{
// do stuff (logging)
throw; // a) continue ex
throw new SomeException("blah", ex); // b) wrap
throw new SomeException("blah"); // c) replace
throw ex; // d) reset stack-trace
}
c) 和 d) 都删除了堆栈跟踪,我能看到的 d) 的唯一“优势”是 throw ex;
保留了确切的类型和可能的额外属性(SQL ex
的错误)。
那么有没有想保留除堆栈跟踪之外的所有异常信息的情况?通常不是,但有些猜测:
- 在混淆库的边界。但是 c) 在这里看起来是更好的选择。
- 在某些生成代码的调用站点,例如在 RegEx 类中。
关于c# - 有任何现实世界的理由使用 throw ex 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4552670/