Java: обработка исключений - PullRequest
5 голосов
/ 15 июля 2011

Есть ли причина не преобразовывать следующий код

try {
    // Do something
} catch (XException e) {
    e.printStackTrace();
} catch (YException e) {
    e.printStackTrace();
} catch (ZException e) {
    e.printStackTrace();
}

в этот код:

try {
    // Do something
} catch (Exception e) {
    e.printStackTrace();
}

Я знаю, что второй перехватывает все виды исключений и неимейте это в виду.И скажем, я хочу обрабатывать все исключения одинаково.Значительна ли разница в производительности?

Ответы [ 12 ]

3 голосов
/ 15 июля 2011

Механизм Java try / catch был настолько настроен в последовательных JVM, что их производительность никогда не будет такой, которую вы должны явно беспокоить. Скорее, вы должны кодировать эти блоки в зависимости от того, нужно ли вам обрабатывать сценарии обнаруженных ошибок различными способами. В вашем примере вы просто печатаете трассировку стека, так что нецелесообразно отлавливать конкретные ошибки - но ваш вариант использования фактически определит, следует ли вам свернуть или убрать эти блоки try / catch.

3 голосов
/ 15 июля 2011

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

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

try {
    // Do something
} catch (XException | YException | ZException e) {
    e.printStackTrace();
}
2 голосов
/ 15 июля 2011

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

2 голосов
/ 15 июля 2011

Иногда вы можете захотеть выполнить разные действия с разными исключениями.

Даже если вы этого не сделаете, вы все равно помогаете другим программистам увидеть полную картину, а не скрывать ее в одном большом исключении; что также происходит с перехватом всех Runtime исключений.

2 голосов
/ 15 июля 2011

Я бы не беспокоился о производительности в данный момент (если вы не знаете, что это реальная проблема).

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

1 голос
/ 15 июля 2011

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

По моему опыту, мотивация размещения обработчика исключений вокруг блока кода состоит в том, чтобы перехватить определенное исключение или набор исключений.Поэтому во время зачатия вы знаете, какие исключения вы хотите перехватить в любом случае, зачем обобщать и использовать класс Exception?

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

  1. Эффективное Java, второе издание - Джошуа Блох: Глава 9
  2. Учебное пособие по Java по исключениям: Преимущества исключений
1 голос
/ 15 июля 2011

Существует разница в отлове исключений RunTimeException, таких как NullPointerException. Они будут пойманы во втором случае, но не в первом.

0 голосов
/ 09 ноября 2012

исключение может возникнуть по многим причинам

Не удается найти файл, который необходимо открыть (fileNotFoundException или InputStreamExcep). Пользователь ввел недопустимые данные.

сетевое соединение потеряно илиВ JVM закончилась память.

Типы исключений: Три вида исключений: Проверенное исключение: Проверенное исключение - это исключение из-за ошибки пользователя или проблемы, которая не предусмотрена программистом.Пример: если файл должен быть открыт, но файл не найден, возникает исключение.Эти исключения нельзя игнорировать во время компиляции.

Непроверенные исключения: исключение времени выполнения - это исключение, которое, вероятно, игнорируется программистом. Оно также известно как исключения времени выполнения. Они игнорируются во времяCompatiation.

Ошибки: проблемы, которые возникают вне контроля программиста.Например, если переполнение стека происходит, возникнет ошибка.Они игнорируются во время компиляции.

Перехват исключений: Используя try / catch, мы можем обработать блок exception.try, размещенный вокруг кода, который может генерировать исключение.

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

Несколько блоков catch: за блоком try может следоватьнесколько блоков захвата.

0 голосов
/ 15 июля 2011

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

Если мы посмотрим на производительность, нет разницы между обработкой в ​​одном блоке catchили с несколькими.

0 голосов
/ 15 июля 2011

Не большая разница с технической точки зрения. Вторая версия будет перехватывать все исключения XYZ плюс любые RuntimeException, которые могут быть выброшены в блоке try. Проверьте, все ли в порядке.

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

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