Специальный 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 и дать исключению распространиться естественно.