Как мне отличить действительно исключительные обстоятельства от рутинного плохого состояния? - PullRequest
1 голос
/ 17 декабря 2008

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

Например, введите строку для пути к папке, но она не найдена. В этом случае, если есть какие-либо входные данные, которые не могут быть найдены (например, имя в коллекции, которая не найдена), лучше всего просто вернуть сообщение об ошибке и какое-то действие?

Е.Г.

public void Find(string name)
{
    if(Names.contains(name)
    {
        string s = Names.get(name);
    }

    if(!Names.contains(string name)
    {
        throw new ???Exception;
    }
}

Или сделать что-то вроде отображения всплывающего окна и изящно обработать ситуацию?

Разумно ли бросать исключение в оператор else или if? Просмотр списка запахов кода, связанных с обработкой исключений, принес бы мне большую пользу.

Ответы [ 3 ]

1 голос
/ 17 декабря 2008
  1. если ваш код может восстановиться после исключения, сделайте это
  2. , если было бы приемлемо требовать, чтобы клиенты проверяли возвращаемое значение для незначительных ожидаемых исключений, сделайте это - это вызов для оценки, см. Ниже
  3. во всех остальных случаях генерировать исключение (или не перехватывать исключение вызываемого метода)

для второго случая, второстепенное и ожидаемое очень чувствительны к контексту

ИМХО не используйте исключения для потока управления, но во всех других случаях вам, вероятно, безопаснее их выбросить

обратите внимание, что в некоторых советах по оптимизации вам нужно проверять условия, а не полагаться на исключения, например file-not-found, но в действительности вы все равно должны ожидать исключения, поскольку файл может быть удален или перемещен между оператором, проверяющим существование, и оператором, пытающимся открыть файл!

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

1 голос
/ 17 декабря 2008

Обычно это работает так:

Если вы можете справиться с ситуацией без перерывов, сделайте это. (Файл не существует, но его ввод не важен для продолжения работы [настройки, необязательная конфигурация и т. Д.])

Если вам нужно вмешательство пользователя, спросите его. (Файл не существует, но он нужен для продолжения работы)

Если это проблема, которую пользователь не может исправить (нехватка памяти, неисправное оборудование и т. Д.), То выдается исключение.

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

0 голосов
/ 17 декабря 2008

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

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