免责声明:众所周知,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/