Неужели так плохо поймать общее исключение? - PullRequest
49 голосов
/ 22 августа 2008

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

Ответы [ 15 ]

0 голосов
/ 07 февраля 2019

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

Поймайте все ошибки, которые вы можете существенно исправить. Иногда это все из них.

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

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

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

0 голосов
/ 16 ноября 2018

Для моего класса IabManager, который я использовал для биллинга в приложении (из онлайн-примера TrivialDrive), я иногда замечал, что сталкиваюсь с множеством исключений. Дошло до того, что было непредсказуемо.

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

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

До:

    catch (final RemoteException exc)
    {
        exc.printStackTrace();
    }
    catch (final IntentSender.SendIntentException exc)
    {
        exc.printStackTrace();
    }
    catch (final IabHelper.IabAsyncInProgressException exc)
    {
        exc.printStackTrace();
    }
    catch (final NullPointerException exc)
    {
        exc.printStackTrace();
    }
    catch (final IllegalStateException exc)
    {
        exc.printStackTrace();
    }

После того, как:

    catch (final Exception exc)
    {
        exc.printStackTrace();
    }
0 голосов
/ 04 июня 2014

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

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

0 голосов
/ 22 августа 2008

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

0 голосов
/ 22 августа 2008

Я думаю, что хороший совет - перехватывать только определенные исключения внутри фреймворка (чтобы хост-приложение могло справиться с крайними случаями, такими как заполнение диска и т. Д.), Но я не понимаю, почему мы не можем поймать все исключения из нашего кода приложения. Проще говоря, бывают случаи, когда вы не хотите, чтобы приложение зависало, независимо от того, что может пойти не так.

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