Должен ли я всегда бросать наиболее конкретные или я должен попытаться обобщить типы исключений?

Предположим, что у вас обычно есть FooException.

/**
 * @throw FooException If Foo is invalid for searching.
 */
public bool exists(Foo a)

Но в какой-то момент вам нужно иметь еще два особых исключения для Foo.

/**
 * @throw FooSearchException (extends FooException) When "a" caused the error.
 * @throw FooReplacementException (extends FooException) When "b" caused the error.
 */
public int replace(Foo a, Foo b)

Потому что вы хотите знать, какой из двух параметров вызвал ошибку.

На этом этапе, что мне делать с помощью метода exists()? Должен ли я изменить его на бросить наиболее специфичный тип исключения или должен ли я сохранить его как можно больше, чтобы однозначно идентифицировать проблему в одной программе ? Метод exists() не должен различать Search и Replacement, но все равно о Search. Что мне делать?

(Обратите внимание, что изменение не повлияет на существующие catch() es, поскольку оба FooSearchException и FooReplacementException extend FooException)

6 голосов | спросил Wes 1 PMpWed, 01 Apr 2015 17:44:43 +030044Wednesday 2015, 17:44:43

1 ответ


5

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

Стремитесь изменить существующий код из общего → конкретного. В конце концов, он не должен нарушать код.

Будьте осторожны с изменением существующего кода из определенного → общего, поскольку это скорее изменение разрыва. Если вы понимаете, что другой случай также должен быть удовлетворен, тогда у вас нет выбора: никогда не подделывайте общее исключение с более конкретным случаем, который не применяется.

Не будьте непоследовательны в своей специфике: Представьте метод, который принял x и y, и если x выведен из определенного диапазона, выдает «аргумент» вне диапазона ", но если y выходит из определенного диапазона, генерирует общее исключение« аргумент », потому что ловить его вместе с ловушкой другого проблемы с y. Результат просто смущает. (Хотя, конечно, можно, например, выбросить «аргумент вне диапазона», если x или y не соответствуют их диапазонам и «аргументному исключению», если комбинация x и y находится вне некоторого коллективного диапазона).

То, что я здесь не охватываю, - это вопрос о том, когда нужно создать другой тип исключения, чтобы быть более конкретным, чем то, что у вас уже есть, что является гораздо более сложным вопросом. Хотя я скажу, что считаю, что стоит считать их «стоимостью» чего-то; если вы «тратите», то что вы получаете за свой счет?

ответил Jon Hanna 1 PMpWed, 01 Apr 2015 19:32:33 +030032Wednesday 2015, 19:32:33

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132