Эта статья MEM10-C. Определить и использовать функцию проверки указателя говорит, что можно сделать проверку в некоторой степени, особенно в ОС Linux.
Я думаю, что здесь есть два вопроса.
В чем разница между 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 на самом деле не использует исключение, тогда вы захотите использовать вторую версию, чтобы избежать предупреждения компилятора.