Я пишу инструмент статического анализа для CIL. Анализ потока управления был бы упрощен, если бы блоки finally можно было интерпретировать как блоки try-catch с повторным броском внутри catch. В С# я не вижу разницы между
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. Должна быть разница, не так ли?