Какой из них является лучшей практикой [дублировать]

Я согласен с ответом от zacherates.

Но вы можете сделать вызов intern () в ваших нелиберальных строках.

Из примера zacherates:

// ... but they are not the same object
new String("test") == "test" ==> false 

Если вы ставите нелитеральное равенство строки, это правда

new String("test").intern() == "test" ==> true 
47
задан dasblinkenlight 14 November 2017 в 17:02
поделиться

9 ответов

Потому что, когда вы ловите исключение, вы должны правильно его обрабатывать. И вы не можете ожидать обработки всех видов исключений в вашем коде. Кроме того, если вы поймаете все исключения, вы можете получить исключение, которое не может справиться и предотвратить код, который является верхним в стеке, чтобы правильно его обрабатывать.

Основной принцип состоит в том, чтобы поймать наиболее специфический тип, который вы можете.

49
ответ дан anthares 16 August 2018 в 00:55
поделиться
  • 1
    Например, java.lang.InterruptedException возникает, когда поток прерывается. Если вы пойманы и проигнорированы, обработка потока не может быть остановлена ​​изящно, и ваш код станет неправильным для запуска в рабочем потоке. Это один из примеров, могут быть и другие. – Pierre 5 October 2011 в 08:32
  • 2
    Я большой поклонник людей, понимающих их рамки. Основная причина, по которой этот совет ужасен, заключается в том, что 90% времени, на котором люди пишут обработку исключений, находятся на границе их API. Я согласен с тем, что в API вы всегда должны улавливать соответствующие исключения, но когда вы находитесь на границе API, пожалуйста, поймайте все, что не убивает систему. – coding 20 May 2016 в 17:31

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

Но иногда вам может понадобиться обрабатывать все исключения таким же образом. В таких случаях catch (Exception) может быть в порядке. Например:

    try
    {
        DoSomething();
    }
    catch (Exception e)
    {
        LogError(e);
        ShowErrorMessage(e); // Show "unexpected error ocurred" error message for user.
    }
5
ответ дан Andrew Bezzub 16 August 2018 в 00:55
поделиться
  • 1
    Это не хорошая модель, чтобы следовать; запись не должна выполняться так, потому что вы получите кучу одинаковых записей для каждого «уровня». от попыток. – Lucero 10 March 2010 в 12:17
  • 2
    Я согласен, я использовал его только как пример. Может быть, не лучший пример :) – Andrew Bezzub 10 March 2010 в 13:19
  • 3
    @Lucero: Я бы подумал, что лучше иметь фреймворк протоколирования, который может консолидировать избыточные записи, чем предполагать, что любой дескриптор слоя (проглатывание) исключает его. Кроме того, если исключения не настолько многочисленны, что регистрация их несколько раз будет представлять собой узкое место в производительности (в этом случае я бы сказал, что это проблема, требующая исправления). Я думаю, что в журнале есть избыточная информация, которая затем может быть отфильтрован с помощью утилиты просмотра журнала, было бы предпочтительнее иметь более сжатый журнал, в котором не хватает одной части информации, которая вам нужна. – supercat 7 January 2013 в 20:07

Вы должны улавливать исключения только в том случае, если вы можете их правильно обработать. Поскольку вы не можете правильно обрабатывать все возможные исключения, вы не должны их ловить: -)

8
ответ дан Darin Dimitrov 16 August 2018 в 00:55
поделиться
  • 1
    Основная проблема такого мышления заключается в том, что существует множество ситуаций, когда правильная обработка для 99% исключений, которые могут быть брошены, будет заключаться в том, чтобы сообщить, что некоторые действия не могут быть завершены и жить продолжительно, но идентифицировать каждый отдельный тип исключение, для которого это был бы правильный ход действий, было бы трудно, если не невозможно. Жаль, что нет никакого механизма для различения & quot; не может удовлетворить запрос & quot; исключения из «CPU находятся в состоянии пожара». исключения. – supercat 8 January 2013 в 02:12
  • 2
    CPU горит, вероятно, вызовет какой-то java.lang.Error. – yegeniy 13 January 2016 в 20:14
  • 3
    & GT; Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать. – yegeniy 13 January 2016 в 20:14

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

16
ответ дан dimitarvp 16 August 2018 в 00:55
поделиться
  • 1
    & Quot; Catching & Quot; исключение не означает просто продолжать выполнение, как будто ничего плохого. A & quot; catch & quot; block - блок кода, где вы делаете что-то . Это что-то может состоять в том, чтобы записывать информацию об исключении, о том, что делает пользователь, или о состоянии пользовательского интерфейса, закрывать соединения и файлы, чтобы приложение сходилось изящно и чтобы уведомить пользователя что случилось. Как это "маскирование" что-нибудь? – user316117 26 June 2017 в 15:44
  • 2
    @ user316117 Exception является высшим классом всех исключений в Java. Поймать это означает, что вы поймаете все возможные ошибки. Как вы узнаете, что делать в таком блоке? Если вы хотите отреагировать на определенную ошибку, поймите его конкретное исключение и поработайте с ним. Практически не использовать все возможные исключения, кроме как ослепить глаза (и я видел, как много коллег это делали, потому что они хотят вернуться домой в конце рабочего дня). – dimitarvp 26 June 2017 в 15:48
  • 3
    @dimitarvp Throwable является высшим классом всех исключений. Он имеет два подкласса, который разделяет исключения в двух ветвях. Один из них - ИСКЛЮЧЕНИЕ, а другой - ОШИБКА. – Neeraj Yadav 4 December 2017 в 19:29

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

Поэтому вы должны улавливать исключения:

  • , которые вы точно знаете, как с этим бороться (например, FileNotFoundException или так)
  • , когда вы повторно их поднимете после этого (например, для выполнения очистки после сбоя)
  • , когда вам нужно передать исключение в другой поток
5
ответ дан Lucero 16 August 2018 в 00:55
поделиться
  • 1
    Нет такой вещи, как OutOfMemoryException. Существует OutOfMemoryError, который находится под иерархией Throwable. – Elad Tabak 2 October 2014 в 11:13
  • 2
    @EladTabak, вы, конечно, правы в отношении Java. При этом метка "java" не было, когда я ответил на вопрос (см. [history version of ] ), и переданное значение, тем не менее, правильное - независимо от реальной среды. – Lucero 2 October 2014 в 15:35

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

Первый случай является самоочевидным, но позвольте мне развить второе:

Doing:

try {
    xxxx
} catch(Exception e) {
    logger.error("Error XXX",e)
}

- это маскировка ошибок, например @dimitarvp.

Но

try {
    xxxx
} catch(Exception e) {
    throw new BussinessException("Error doing operation XXX",e)
}

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

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

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

Если в блоке кода вы можете получить SQLException и NetworkException, вы должны поймать их и предоставить адекватные сообщения и для каждого из них. Но если в конце блока try / catch у вас есть Exception, сопоставляющее его с BussinessException, это нормально для меня. Фактически, я нахожу адекватным, что более высокие уровни обслуживания только бросают бизнес-исключения (с деталями внутри).

0
ответ дан lujop 16 August 2018 в 00:55
поделиться

Но иногда все в порядке! Например, если у вас есть фрагмент кода, который делает что-то «лишнее», что вам действительно неинтересно, и вы не хотите, чтобы оно взорвало ваше приложение. Например, недавно я работал над большим приложением, когда наши деловые партнеры хотели, чтобы определенная ежедневная транзакция была суммирована в новом файле журнала. Они объяснили, что журнал не так важен для них и что он не квалифицируется как требование. Это было что-то дополнительное, что помогло бы им понять обрабатываемые данные. Они им не нужны, потому что они могли получить информацию в другом месте. Таким образом, это редкий случай, когда прекрасно поймать и проглатывать исключения.

Я также работал в компании, где все Throwables были пойманы, а затем повторно встроены в пользовательское исключение RuntimeException. Я бы не рекомендовал этот подход, а просто указал, что это сделано.

0
ответ дан MattC 16 August 2018 в 00:55
поделиться

Кроме того, что еще ответил @anthares:

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

Основной принцип состоит в том, чтобы поймать наиболее специфический тип, который вы можете.

catch(Exception) является плохой практикой, потому что он также ловит все исключение RuntimeException (исключенное исключение).

0
ответ дан taringamberini 16 August 2018 в 00:55
поделиться
0
ответ дан Vincent Fleetwood 16 August 2018 в 00:55
поделиться
Другие вопросы по тегам:

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