Проблема при работе с исключениями

Специальный catch должен стоять перед catch(Exception), иначе он недостижим. Для повторного проброса текущего исключения используйте throw; без переменной.

Короткий ответ

Что ответить на собеседовании

Специальный catch должен стоять перед catch(Exception), иначе он недостижим. Для повторного проброса текущего исключения используйте throw; без переменной.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо выяснить, каким образом можно вернуть наружу исключение, которое генерируется внутри блока try, чтобы его можно было обработать или пробросить дальше.

public void Test()
{
    try
    {
        var calcResult = Calculate();
        throw new MyCustomException("qwerty");
    }
    
    catch(Exception ex)
    {
        
    }
    
    catch(MyCustomException customEx)
    {
        Console.WriteLine(customEx);
        throw customEx;
    }
}

Ответ

Специальный catch должен стоять перед catch(Exception), иначе он недостижим. Для повторного проброса текущего исключения используйте throw; без переменной.

try
{
    var calcResult = Calculate();
    throw new MyCustomException("qwerty");
}
catch (MyCustomException ex)
{
    Console.WriteLine(ex.Message);
    throw;
}

Общий catch в исходнике перехватывает в том числе MyCustomException, поэтому последующий специальный блок запрещён компилятором. Пустой catch скрывал бы ошибку от вызывающего кода. throw ex; меняет точку начала стека, а throw; сохраняет исходный путь. Если обработки здесь вообще нет, лучше убрать catch и дать исключению распространиться естественно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее