Что выведет код 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 ошибок.