Я видел этот пример:
static void Main(string[] args)
{
Console.WriteLine("Start");
try
{
SomeOperation();
}
catch (Exception) when (EvaluatesTo())
{
Console.WriteLine("Catch");
}
finally
{
Console.WriteLine("Outer Finally");
}
}
private static bool EvaluatesTo()
{
Console.WriteLine($"EvaluatesTo: {Flag}");
return true;
}
private static void SomeOperation()
{
try
{
Flag = true;
throw new Exception("Boom");
}
finally
{
Flag = false;
Console.WriteLine("Inner Finally");
}
}
Что производит следующий вывод:
Start
EvaluatesTo: True
Inner Finally
Catch
Outer Finally
Это звучит странно для меня, и я ищу хорошее объяснение этого порядка, чтобы обернуть его мне в голову. Я ожидал, что блок finally
будет выполнен до when
:
Start
Inner Finally
EvaluatesTo: True
Catch
Outer Finally
В документации указано, что этот порядок выполнения правилен, но он не уточняет, почему это делается так и что именно являются правилами порядка выполнения здесь.