Поймать против Поймать (исключение е) и бросить против броска е

Эта статья MEM10-C. Определить и использовать функцию проверки указателя говорит, что можно сделать проверку в некоторой степени, особенно в ОС Linux.

23
задан DanM7 27 February 2013 в 20:57
поделиться

1 ответ

Я думаю, что здесь есть два вопроса.


В чем разница между throw и throw e;?

Я не думаю, что когда-либо есть веская причина написать catch (Exception e) { throw e; }. Это теряет оригинальную трассировку стека. При использовании throw; исходная трассировка стека сохраняется. Это хорошо, потому что это означает, что причину ошибки легче найти.


В чем разница между catch и catch (Exception e)?

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

Переменная 'e' объявлена, но никогда не использовалась

Имеет смысл задать этот вопрос, если у вас есть какой-то другой код в блоке catch, который действительно делает что-то полезное. Например, вы можете захотеть записать исключение:

try
{
    int value = 1 / int.Parse("0");
}
catch (Exception e)
{
    LogException(e);
    throw;
}

Теперь необходимо использовать первую версию, чтобы у вас была ссылка на перехваченное исключение.

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

52
ответ дан Mark Byers 27 February 2013 в 20:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: