Бросать или повторно бросать исключение? - PullRequest
3 голосов
/ 11 января 2012

Если я добавлю предложение catch:

...
catch(Exception e)
{
    throw new Exception("msg", e); 
}

Я выбрасываю или перебрасываю исключение e?

Так что правильно ли говорить, что выражение throw, используемое в catch перебрасывание исключение при использовании его в блоке try или в другом месте выбрасывание исключение?

В конечном итоге, когда или где вы throw исключение и когда или где повторно выбрасывать исключение?

Спасибо.

Ответы [ 6 ]

4 голосов
/ 11 января 2012

В первый раз вы вызываете исключение.

throw new Exception();

Вы перебрасываете пойманное исключение

} catch (Exception e) {
   // do something
   throw e;
}

Вы оборачиваете исключение, выбрасывая другое исключение, которое содержит это исключение.

} catch (Exception e) {
   // do something
   throw new Exception(e);
}
4 голосов
/ 11 января 2012

Я бы назвал это выбрасыванием исключения.

Это перебрасывание исключения:

...
catch(Exception e)
{
    throw e;
}

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

0 голосов
/ 11 января 2012

Ваш вопрос: «Я выбрасываю или повторно выкидываю исключение e?»

Вы не выбрасываете и не перебрасываете исключение e.Исходное исключение e (исключение, которое было перехвачено) является причиной, по которой вы сгенерировали новое исключение, и, следовательно, оно будет отображаться в connectedBy недавно сгенерированного исключения.

0 голосов
/ 11 января 2012

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

re-throw - дляразличные цели, во-первых, сообщить вызывающей стороне, что произошло что-то неправильное, во-вторых, передать трассировку стека вызывающей стороне с более подробной информацией о том, в какой строке произошла ошибка кода и т. д.,

0 голосов
/ 11 января 2012

Чтобы ответить на последний вопрос:

Создайте новое исключение, если это добавит значение.Например, обычно заключают в себе базовые исключения для конкретных приложений для потребления на более высоких уровнях.Они почти всегда должны быть связаны в цепочку для сохранения информации об исходном исключении.

Повторное выбрасывание IMO обычно не является хорошей идеей, поскольку слой контекста будет удален из цепочки исключений / трассировки стека.OTOH, если вы действительно не можете ничего с этим поделать, повторный бросок может иметь смысл.В этом случае я обычно указываю метод throws и не выполняю локальную обработку исключений, за исключением случаев, когда это необходимо для очистки локальных ресурсов / и т. Д.

0 голосов
/ 11 января 2012

http://www.codinghorror.com/blog/2004/07/rethrowing-exceptions.html

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

Обычно улов должен быть в состоянии обработать само исключение, но если это невозможно, я бы посоветовал повторно вызвать исключение. Еще одна вещь, на которую следует обратить внимание, это то, где находится перехват (например, в контроллере по сравнению с моделью, вы обычно хотите перехват в действии контроллера, чтобы вы могли обработать его в представлении. Однако в модели часто происходят исключения) *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...