Есть ли какая-то выгода в том, чтобы ловить разные исключения отдельно? - PullRequest
1 голос
/ 13 февраля 2012

Помимо очевидного случая, когда разные исключения рассматриваются по-разному, есть ли польза от обработки исключений отдельно? Я вижу много кода, который выглядит примерно так:

try {
    doSomethingThatMayThrowExceptions();
} catch (SomeException e) {
} catch (OtherException e) {
}

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

Выводом будет следующий вопрос: лучше ли в любом случае указывать точный тип исключения, которое вы перехватываете, если оно только одно? Например:

try {
    number = Integer.parseInt(numberString);
} catch (Exception e) {
    // ...
}

В приведенном выше примере блок try может выдавать только NumberFormatException. Есть ли минус в том, чтобы поймать общий Exception здесь?

Ответы [ 4 ]

5 голосов
/ 13 февраля 2012

В приведенном выше примере блок try может генерировать только исключение NumberFormatException. Есть ли минус в том, чтобы поймать здесь общее исключение?

Не совсем. Но можно спросить, чего вы добиваетесь "сокрытием" точного исключения?

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

РЕДАКТИРОВАТЬ: Простите меня. Приведенный выше пример также может генерировать непроверенные исключения, т.е. NPE, так что вы на самом деле ловите больше исключений и относитесь к ним одинаково. Возможно, вы захотите реализовать другую обработку исключений для этих исключений (если вы даже хотите перехватывать и обрабатывать непроверенные исключения).

3 голосов
/ 13 февраля 2012

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

1 голос
/ 13 февраля 2012

Для меня это факт обслуживания, если вы написали приложение год назад, и генерируется исключение, и вы смотрите на код, это отстой, чтобы увидеть throws Exception / } catch (Exception e) {, тогда мне нужно прочитать все javadocs кода в методе, чтобы увидеть, какие типы исключений выбрасываются.

Так что я склонен ловить определенные типы исключений, чтобы знать, с чем я имею дело. Другим примером может быть SQLException. В определенных случаях; в зависимости от errorCode в sqle, я хотел бы повторить операцию с базой данных, тогда как в любом другом типе исключения я хочу прервать и сообщить.

0 голосов
/ 13 февраля 2012

Нет, это действительно сводится к тому, чтобы просто сделать так, чтобы у вас было условие ловли для различных возможных непредвиденных обстоятельств.Как правило, перехватывать только Exception - это плохо, потому что некоторые операции могут привести к необходимости перехватывать IOException и SQLException, причем для каждого из них требуется очень разная обработка ошибок.

В большинстве случаев вам действительно понадобитсяблок catch для Exception, так что у вас есть универсальный обработчик ошибок, где вы можете исправить ситуацию и вызвать общую программную ошибку.Хотя это должно произойти после конкретных случаев в блоке try-catch.

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