我正在为CIL编写一个静态分析工具.如果finally块可以被解释为在catch中具有重新抛出的try-catch块,则将简化控制流分析.在C#中,我看不出它们之间的区别
try
{
// ...
}
finally
{
// finally code here
}
Run Code Online (Sandbox Code Playgroud)
和
try
{
// ...
}
catch
{
// finally code here
throw;
}
Run Code Online (Sandbox Code Playgroud)
或之间
try
{
// ...
}
catch(Exception e)
{
// catch code here
}
finally
{
// finally code here
}
Run Code Online (Sandbox Code Playgroud)
和
try
{
try
{
// ...
}
catch (Exception e)
{
// catch code here
}
}
catch
{
// finally code here
throw;
}
Run Code Online (Sandbox Code Playgroud)
在CIL中甚至有一个最终的块和最终指令.必须有区别,有吗?
Jon*_*eet 14
否 - finally即使没有抛出异常也会执行一个块,即使另一个块捕获异常也是如此catch.(无论catch块是否随后抛出异常,都是如此.)
哦,如果块从方法返回,也会执行一个finally块.try
基本上,如果您希望代码在执行离开语句时始终执行,finally那么就是您想要的.虽然在C#中我发现我很少写一个显式finally块 - 一个using语句几乎总是使代码更简单.
Eri*_*ert 13
添加到Jon的 - 当然是正确的 - 回答:你实际上在描述一个try-fault块.也就是说,一个try-fault块相当于try后跟catch-everything和automatic - throw.
C#不支持try-fault块,但CIL不支持,所以如果你正在阅读IL而你看到一个fault块,现在你就知道它是什么了.
而且,这是正确的说法
try{}
catch {}
finally {}
Run Code Online (Sandbox Code Playgroud)
相当于
try
{
try { }
catch { }
}
finally { }
Run Code Online (Sandbox Code Playgroud)
实际上在C#编译器中就是它的作用; 所有try-catch-finally块都被重写为try-finally中的嵌套try-catch.这是一个简化的假设,在编写静态分析器时可以提供帮助.
| 归档时间: |
|
| 查看次数: |
622 次 |
| 最近记录: |