Что выведет код Senior Исключения обновлено
Фильтры when и порядок вычисления
Вопрос
Что выведет программа (.NET 8)? По строке на каждый вывод.
static bool Log(string s) { Console.WriteLine("filter " + s); return false; }
try
{
try
{
throw new Exception("x");
}
catch (Exception) when (Log("inner"))
{
Console.WriteLine("inner catch");
}
finally
{
Console.WriteLine("inner finally");
}
}
catch (Exception) when (Log("outer") || true)
{
Console.WriteLine("outer catch");
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: filter inner, filter outer, inner finally, outer catch. Двухпроходная обработка.
Что выведет
filter inner
filter outer
inner finally
outer catch
Разбор
Двухпроходная обработка. На первом проходе ищется обработчик: фильтр внутреннего блока печатает filter inner и отвергает, фильтр внешнего печатает filter outer и принимает. Только после этого начинается раскрутка: выполняется inner finally, затем outer catch. Поэтому оба фильтра печатаются раньше, чем finally.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.