c# - 编写仅包含 throw 语句的 catch block 是否有任何技术原因?

标签 c# exception-handling

免责声明:众所周知,catch (ex) { throw ex; is bad practice .这个问题不是关于那个的。


在挖掘 Microsoft 引用资源时,我注意到 a lot of methods 中存在以下模式:

try {
    ...
} catch {
    throw;
}

没有日志记录,没有调试代码——只是一个简单的 catch { throw;

显然,Microsoft 的人员应该相当精通 C# 的使用,那么这样做而不是完全省略 catch block (和 try 语句)的意义何在? 像这样编码是否有技术原因,还是纯粹是风格选择?

注意:我不知道它是否相关,但我能找到的所有此类实例还包含嵌套在 try 中的 try-finally block try-catch block 的 子句。

最佳答案

它会影响异常过滤器何时运行。

给定

void f() {
  using (var x = AcquireResource()) {
    x.DoSomething();
    x.DoSomethingElse();
  }
}

对比

void f() {
  try {
    using (var x = AcquireResource()) {
      x.DoSomething();
      x.DoSomethingElse();
    }
  } catch {
    throw;
  }
}

void g() {
  try {
    f();
  } catch (Exception ex) when (h()) {
    // ...
  }
}

f 的第一个版本将允许过滤器 h()x 被释放之前被调用。 f 的第二个版本确保在运行外部代码之前释放 x

在你链接的代码中,SqlConnectionHolder用的比较多,catch { throw; block 都是围绕 SqlConnectionHolder 的使用。

关于c# - 编写仅包含 throw 语句的 catch block 是否有任何技术原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46643019/

相关文章:

c# - 代码隐藏中的数据绑定(bind)

c# - WPF:DataGrid 显示错误

c# - 通过 WCF 发送 GZIP 流

ruby - 如何处理不知道 Ruby 中的库方法可以引发哪些异常?

c# - 在我的 C# 应用程序中处理异常的正确位置在哪里?

java - Java 如何知道 RuntimeExceptions 未被检查?

Python BaseHTTPServer,如何捕获/捕获 "broken pipe"错误?

c# - c# 中的聚合异常不保存单个异常消息

c# - 表达式树 : iterate through strings and check if they contained in another Expression

c# - 无法加载文件或程序集 'Newtonsoft.Json,版本 = 3.5.0.0