[英]Does try-catch-throw adds any value over no exception handling at all?
[英]In .NET, is finally equivalent to try-catch-throw?
我正在为CIL编写一个静态分析工具。 如果finally块可以被解释为在catch中具有重新抛出的try-catch块,则将简化控制流分析。 在C#中,我看不出它们之间的区别
try
{
// ...
}
finally
{
// finally code here
}
和
try
{
// ...
}
catch
{
// finally code here
throw;
}
或之间
try
{
// ...
}
catch(Exception e)
{
// catch code here
}
finally
{
// finally code here
}
和
try
{
try
{
// ...
}
catch (Exception e)
{
// catch code here
}
}
catch
{
// finally code here
throw;
}
在CIL中甚至有一个最终的块和最终指令。 必须有区别,有吗?
否 - 即使没有抛出异常, 也会执行finally
块,即使另一个catch
块捕获异常也是如此。 (无论catch
块本身是否抛出异常,都是如此。)
哦,如果try
块从方法返回, 也会执行finally
块。
基本上,如果您希望代码始终在执行离开语句时执行,那么finally
就是您想要的。 虽然在C#中我发现我很少写一个显式的finally
块 - using
语句几乎总是使代码更简单。
添加到Jon的 - 当然是正确的 - 回答:你实际上是在描述一个try-fault
块。 也就是说, try-fault
块相当于try
,然后catch
-everything和自动重新throw
。
C#不支持try-fault
块,但是CIL确实如此,所以如果你正在读IL并且你看到了一个fault
块,现在你知道它是什么了。
而且,这是正确的说法
try{}
catch {}
finally {}
相当于
try
{
try { }
catch { }
}
finally { }
实际上在C#编译器中就是它的作用; 所有try-catch-finally块都被重写为try-finally中的嵌套try-catch。 这是一个简化的假设,在编写静态分析器时可以提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.