我正在为 CIL 编写一个静态分析工具。如果 finally 块可以解释为 try-catch 块并在 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 块和 endfinally 指令。应该有区别吧?