Неужели так уж плохо поймать общее исключение?

При анализе устаревшего кода с помощью FXCop 9X_exception мне пришло в голову, действительно ли так 9X_custom-exceptions уж плохо ловить общую ошибку исключения 9X_exceptions в блоке try или вам нужно искать конкретное 9X_exception исключение. Мысли на открытку, пожалуйста.

70
2

  • Этот вопрос лучше подходит для [ ...
11
Общее количество ответов: 11

Ответ #1

Ответ на вопрос: Неужели так уж плохо поймать общее исключение?

Очевидно, что это один из тех вопросов, на 9X_custom-exceptions которые единственный правильный ответ — «это 9X_exception-handling зависит».

Главное, от чего это зависит, это 9X_exceptions от того, где вы ловите исключение. В общем, библиотеки 9X_exception-handling должны быть более консервативными при перехвате 9X_custom-exceptions исключений, тогда как на верхнем уровне 9X_custom-exceptions вашей программы (например, в вашем основном 9X_custom-exceptions методе или в верхней части метода действия 9X_exception в контроллере и т. д.) вы можете быть более 9X_custom-exceptions либеральными в том, что вы ловите.

Причина 9X_exception-handling этого в том, что, например. вы не хотите 9X_custom-exceptions перехватывать все исключения в библиотеке, потому 9X_custom-exceptions что вы можете маскировать проблемы, которые 9X_custom-exceptions не имеют ничего общего с вашей библиотекой, например, «OutOfMemoryException», которое 9X_exception-handling вы действительно предпочли бы всплывать, чтобы 9X_exception пользователь мог быть уведомлен, и т. д. С 9X_custom-exceptions другой стороны с другой стороны, если вы 9X_exception говорите об отлове исключений внутри вашего 9X_exception-handling метода main(), который перехватывает исключение, отображает 9X_exception-handling его и затем завершает работу... ну, вероятно, здесь 9X_custom-exceptions безопасно перехватывать практически любое 9X_exceptions исключение.

Самое важное правило перехвата 9X_custom-exceptions всех исключений заключается в том, что вы 9X_custom-exceptions никогда не должны просто проглатывать все 9X_exception исключения молча... например. что-то вроде 9X_exceptions этого в Java:

try { something(); } catch (Exception ex) {} 

или это в Python:

try: something() except: pass 

Потому что 9X_exception-handling это могут быть одни из самых сложных проблем 9X_exceptions для отслеживания.

Хорошее эмпирическое правило 9X_exception-handling заключается в том, что вы должны перехватывать 9X_exceptions только те исключения, с которыми вы можете 9X_exception правильно справиться самостоятельно. Если 9X_custom-exceptions вы не можете полностью обработать исключение, вы 9X_exception должны передать его тому, кто может.

115
1

  • Выявление всех исключений на яз ...

Ответ #2

Ответ на вопрос: Неужели так уж плохо поймать общее исключение?

Если вы не выполняете журналирование и очистку 9X_exception кода во внешнем интерфейсе своего приложения, я 9X_exceptions думаю, что отлавливать все исключения — это 9X_exception-handling плохо.

Мое основное эмпирическое правило 9X_exception-handling заключается в том, чтобы перехватывать все 9X_exception-handling ожидаемые исключения, а все остальное является 9X_exception ошибкой.

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

31
0

Ответ #3

Ответ на вопрос: Неужели так уж плохо поймать общее исключение?

Да! (кроме «верхней части» вашего приложения)

Перехватывая 9X_exception исключение и позволяя продолжить выполнение 9X_exception-handling кода, вы заявляете, что знаете, как справиться 9X_exception-handling с конкретной проблемой, обойти или исправить 9X_exceptions ее. Вы утверждаете, что это исправимая ситуация. Перехват Exception 9X_exceptions или SystemException означает, что вы обнаружите 9X_exceptions такие проблемы, как ошибки ввода-вывода, сетевые 9X_exception ошибки, ошибки нехватки памяти, ошибки отсутствия 9X_exceptions кода, разыменование нулевого указателя и 9X_exception-handling тому подобное. Это ложь, чтобы сказать, что 9X_exception вы можете справиться с этим.

В хорошо организованном 9X_exceptions приложении эти неустранимые проблемы должны 9X_exception-handling решаться на самом верху стека.

Кроме того, по 9X_exception-handling мере развития кода вы не хотите, чтобы ваша 9X_exception функция перехватывала новое исключение, которое 9X_custom-exceptions будет добавлено в будущем к вызываемому методу.

15
1

  • Захват можно использовать для добавления дополнительной информации, а затем снова забросить, ...

Ответ #4

Ответ на вопрос: Неужели так уж плохо поймать общее исключение?

На мой взгляд, вы должны перехватывать все 9X_exception-handling исключения, которые вы ожидаете, но это правило 9X_custom-exceptions применимо ко всему, кроме логики вашего 9X_exception интерфейса. На всем пути вниз по стеку вызовов 9X_custom-exceptions вам, вероятно, следует создать способ перехватывать 9X_custom-exceptions все исключения, вести журнал/давать отзывы 9X_exceptions пользователей и, если это необходимо и возможно, корректно 9X_exception завершать работу.

Нет ничего хуже, чем сбой 9X_exceptions приложения, когда на экран вываливается 9X_exception-handling какая-то неудобная для пользователя трассировка 9X_exceptions стека. Это не только дает (возможно, нежелательное) понимание 9X_exceptions вашего кода, но также сбивает с толку вашего 9X_exception-handling конечного пользователя, а иногда даже отпугивает 9X_custom-exceptions его от конкурирующего приложения.

12
0

Ответ #5

Ответ на вопрос: Неужели так уж плохо поймать общее исключение?

Было много философских дискуссий (больше 9X_custom-exceptions похожих на споры) по этому вопросу. Лично 9X_exceptions я считаю, что худшее, что вы можете сделать, — это 9X_exception проглотить исключения. Следующее худшее 9X_exception — позволить исключению всплывать на поверхность, где 9X_custom-exceptions пользователь получает неприятный экран, полный 9X_exception технической чепухи.

8
2

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

Ответ #6

Ответ на вопрос: Неужели так уж плохо поймать общее исключение?

Ну, я не вижу никакой разницы между перехватом 9X_exception-handling общего исключения или конкретного, за исключением 9X_custom-exceptions того, что при наличии нескольких блоков 9X_exception catch вы можете реагировать по-разному в 9X_exception зависимости от того, что это за исключение.

В 9X_custom-exceptions заключение, вы поймаете как IOException, так и NullPointerException с общим 9X_exceptions Exception, но способ, которым ваша программа должна 9X_exceptions реагировать, вероятно, отличается.

5
0

Ответ #7

Ответ на вопрос: Неужели так уж плохо поймать общее исключение?

Я думаю, тут двоякое дело.

Во-первых, если 9X_exception вы не знаете, какое исключение произошло, как 9X_exceptions вы можете надеяться восстановиться после 9X_exceptions него. Если вы ожидаете, что пользователь 9X_exception может ввести имя файла неправильно, вы можете 9X_exceptions ожидать исключение FileNotFoundException 9X_custom-exceptions и попросить пользователя повторить попытку. Если 9X_exceptions тот же самый код сгенерирует NullReferenceException, и 9X_exception вы просто скажете пользователю попробовать 9X_exception-handling еще раз, он не узнает, что произошло.

Во-вторых, рекомендации 9X_custom-exceptions FxCop сосредоточены на коде библиотек/фреймворков 9X_exception-handling — не все их правила предназначены для применения 9X_exception к веб-сайтам EXE или ASP.Net. Так что иметь 9X_exceptions глобальный обработчик исключений, который 9X_custom-exceptions будет регистрировать все исключения и корректно 9X_custom-exceptions завершать работу приложения, — это хорошо.

3
1

  • @KrzysztofCichocki - я знаю, что это устарело, но на самом деле кодирование логики файла с использованием исключений таким образом более правильно. Есть отличное объяснение Эрика Липперта [здесь] (https://blogs.msdn.microsoft.com/ericlippert/2008 ...

Ответ #8

Ответ на вопрос: Неужели так уж плохо поймать общее исключение?

Проблема с перехватом всех исключений заключается 9X_exception в том, что вы можете перехватывать те, которых 9X_exception не ожидаете, или те, которые вы не должны 9X_exceptions не перехватывать. Дело в том, что любое исключение 9X_exceptions указывает на то, что что-то пошло не так, и 9X_exceptions вы должны разобраться, прежде чем продолжить, иначе 9X_exception-handling вы можете столкнуться с проблемами целостности 9X_exceptions данных и другими ошибками, которые не так 9X_exception-handling просто отследить.

Чтобы привести один пример, в 9X_exceptions одном проекте я реализовал тип исключения 9X_custom-exceptions под названием CriticalException. Это указывает 9X_custom-exceptions на состояние ошибки, которое требует вмешательства 9X_exceptions разработчиков и/или административного персонала, в 9X_exception-handling противном случае клиентам будут неправильно 9X_exception выставлены счета или могут возникнуть другие 9X_exceptions проблемы с целостностью данных. Его также 9X_exception можно использовать в других подобных случаях, когда 9X_exception-handling недостаточно просто зарегистрировать исключение 9X_exceptions и необходимо отправить оповещение по электронной 9X_exceptions почте.

Другой разработчик, который не совсем 9X_custom-exceptions понял концепцию исключений, затем завернул 9X_exceptions некоторый код, который потенциально мог 9X_custom-exceptions вызвать это исключение, в общий блок try...catch, который 9X_exception отбрасывал все исключения. К счастью, я 9X_exceptions заметил это, но это могло привести к серьезным 9X_exception-handling проблемам, тем более что «очень необычный» угловой 9X_exception-handling случай, который он должен был отлавливать, оказался 9X_exception гораздо более распространенным, чем я ожидал.

В 9X_exception общем, перехватывать общие исключения плохо, если 9X_exception-handling вы не уверены на 100%, что знаете точно какие 9X_exception виды исключений будут генерироваться и при 9X_exceptions каких обстоятельствах. Если вы сомневаетесь, позвольте 9X_custom-exceptions им вместо этого подняться до обработчика 9X_custom-exceptions исключений верхнего уровня.

Аналогичное правило 9X_exception здесь — никогда не генерировать исключения 9X_custom-exceptions типа System.Exception. Вы (или другой разработчик) можете 9X_exception-handling захотеть перехватить свое конкретное исключение 9X_exception выше в стеке вызовов, позволяя другим пройти.

(Однако 9X_exceptions следует отметить один момент. В .NET 2.0, если 9X_custom-exceptions поток сталкивается с какими-либо неперехваченными 9X_exception-handling исключениями, он выгружает весь домен вашего 9X_exceptions приложения. Поэтому вам следует обернуть 9X_exception-handling основную часть потока в общий блок try...catch 9X_exception и передать любые исключения, пойманные там, в 9X_exception-handling ваш глобальный код обработки исключений.)

3
0

Ответ #9

Ответ на вопрос: Неужели так уж плохо поймать общее исключение?

Я хотел бы сыграть защитника дьявола, который 9X_exceptions ловит исключение, регистрирует его и повторно 9X_exceptions бросает. Это может быть необходимо, если, например, вы 9X_exceptions находитесь где-то в коде и возникает непредвиденное 9X_exception исключение, вы можете его поймать, записать 9X_exception-handling значимую информацию о состоянии, которая 9X_custom-exceptions не будет доступна в простой трассировке 9X_exception стека, а затем повторно передать ее на верхние 9X_exception-handling уровни, чтобы иметь дело с.

2
0

Ответ #10

Ответ на вопрос: Неужели так уж плохо поймать общее исключение?

Есть два совершенно разных варианта использования. Первый 9X_exception - это то, о чем думает большинство людей, пытаясь 9X_exception-handling / уловить некоторую операцию, которая требует 9X_exception проверенного исключения. Это ни в коем случае 9X_exceptions не должно быть универсальным.

Второе, однако, заключается 9X_custom-exceptions в том, чтобы предотвратить прерывание вашей 9X_exception программы, когда она может продолжаться. Вот 9X_exception эти случаи:

  • Начало всех потоков (по умолчанию исключения исчезают без следа!)
  • Внутри основного цикла обработки, который, как вы ожидаете, никогда не завершится.
  • Внутри цикла обработка списка объектов, сбой одного из которых не должен останавливать другие.
  • Начало «основного» потока. Здесь вы можете контролировать сбой, например выгрузить небольшой объем данных в стандартный вывод, когда у вас заканчивается память.
  • Если у вас есть "Runner", который запускает код (например, если кто-то добавляет вам слушателя, и вы вызываете слушателя), то при запуске кода вы должны поймать Exception, чтобы зарегистрировать проблему и позволить вам продолжать уведомлять других слушатели.

В этих случаях вы ВСЕГДА хотите 9X_custom-exceptions перехватить Exception (иногда даже Throwable), чтобы 9X_custom-exceptions отловить программные / неожиданные ошибки, зарегистрировать 9X_exception их и продолжить.

2
0

Ответ #11

Ответ на вопрос: Неужели так уж плохо поймать общее исключение?

Непопулярное мнение: не совсем.

Выявите все 9X_custom-exceptions ошибки, от которых можно полноценно исправить. Иногда 9X_custom-exceptions это все.

По моему опыту, более важно откуда возникло 9X_custom-exceptions исключение, чем какое исключение на самом 9X_exceptions деле выбрасывается. Если вы храните исключения 9X_exceptions в тесноте, вы обычно не проглатываете ничего, что 9X_exception в противном случае было бы полезным. Большая 9X_exceptions часть информации, закодированной в типе 9X_exception-handling ошибки, является вспомогательной, поэтому 9X_exception-handling вы, как правило, в любом случае эффективно 9X_custom-exceptions улавливаете все из них (но теперь вам нужно 9X_custom-exceptions найти документацию API, чтобы получить полный 9X_exceptions набор возможные исключения).

Имейте в виду, что 9X_custom-exceptions некоторые исключения, которые должны всплывать 9X_custom-exceptions вверх почти в каждом случае, например, KeyboardInterrupt и 9X_exception SystemExit в Python. К счастью для Python, они хранятся 9X_exception в отдельной ветви иерархии исключений, поэтому 9X_custom-exceptions вы можете позволить им всплыть, поймав Exception. Хорошо 9X_custom-exceptions спроектированная иерархия исключений делает 9X_exception этот тип вещей действительно простым.

В основном 9X_exceptions перехват общих исключений вызывает серьезные 9X_exceptions проблемы при работе с ресурсами, которые 9X_exceptions необходимо очистить (возможно, в предложении 9X_exception finally), поскольку универсальный обработчик может 9X_exception легко пропустить такие вещи. К счастью, это 9X_exception-handling не проблема для языков с defer, таких конструкций 9X_exceptions как Python with или RAII в C++ и Rust.

1
0