Возможный дубликат:
разница между throw и throw new Exception()
Какой смысл иметь
catch (Exception)
{
throw;
}
Что это делает?
Возможный дубликат:
разница между throw и throw new Exception()
Какой смысл иметь
catch (Exception)
{
throw;
}
Что это делает?
Само по себе ключевое слово throw
просто заново вызывает исключение, обнаруженное выше в инструкции catch
. Это удобно, если вы хотите выполнить некоторую рудиментарную обработку исключений (возможно, компенсирующее действие, например, откат транзакции), а затем перестроить исключение на вызывающий метод.
Этот метод имеет одно существенное преимущество перед улавливанием исключения в переменной и метать этот экземпляр: он сохраняет исходный стек вызовов. Если вы поймаете (Exception ex) и затем выбросите ex, ваш стек вызовов начнется только с этого оператора throw, и вы потеряете метод/строку исходной ошибки.
Иногда вы можете сделать что-то вроде этого:
try
{
// do some stuff that could cause SomeCustomException to happen, as
// well as other exceptions
}
catch (SomeCustomException)
{
// this is here so we don't double wrap the exception, since
// we know the exception is already SomeCustomException
throw;
}
catch (Exception e)
{
// we got some other exception, but we want all exceptions
// thrown from this method to be SomeCustomException, so we wrap
// it
throw new SomeCustomException("An error occurred saving the widget", e);
}
Он повторяет ту же ошибку, вы ничего не получаете от этого.
Иногда вы можете использовать метод catch для выполнения какого-либо ведения журнала или чего-то другого, не перебирая ваши исключения следующим образом:
catch (Exception) {
myLogger.Log(LogLevels.Exception, "oh noes!")
throw;
}
Я изначально ошибочно думал, что это раскрутит ваш стек, но это произойдет только в том случае, если вы сделаете следующее:
catch (Exception err) {
throw err;
}
Единственная причина, о которой я могу думать, - это если вы хотите поставить там точку останова во время отладки.
Это также код по умолчанию, создаваемый некоторыми инструментами, которые я думаю.
Просто переверните текущее исключение, и это исключение сохранит его "источник" и трассировку стека.