c# - 有任何现实世界的理由使用 throw ex 吗?

标签 c# .net exception-handling

在 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/

相关文章:

c# - 将用户控件列表插入到特定的列和行

.net - 如何在 C#/.Net 中表示线性类型?

c# - DllImport 不工作

c++ - boost 异常

c# - 调试/代码跟踪时,是否使用 C# 在 Visual Studio 中浏览对象/类?

c# - c#代码隐藏中的数据模板

C#:DataContractSerializer 和不同的流

c# - 如何在c#中的String末尾跳出while循环

c# - 访问冲突 : Attempted to read or write protected memory

java - 捕获应用程序停止异常时应该使用 System.exit(1) 吗?