Исключения против "если" в C # - PullRequest
1 голос
/ 23 января 2011

У меня вопрос контрольного потока.В моей компании мы создаем множество bool методов, которые возвращают false, если произошла ошибка.Пример:

public bool Foo(string path, string fileName, ref string error)
{
    if (path == null)
    {
        error = "path is null";
        return false;
    }
    path += fileName;
    return true;
}

Как видите, это некрасиво.Я хочу использовать его с такими исключениями:

public voidFoo(string path, string fileName, ref string error)
{
    if (path == null)
    {
        throw new SomeException("Path is null.");
    }
    path += fileName;
    return true;
}

Но мы беспокоимся о накладных расходах.Должны ли мы?

Ответы [ 7 ]

3 голосов
/ 23 января 2011

Если исключение составляет , а не , то накладные расходы вашего try...catch незначительны.Итак, эмпирическое правило:

  • Если исключение составляет вероятность для выброса (т. Е. Если path == null является «поддерживаемым» сценарием), используйте возвращаемое значение.
  • Если исключение маловероятно , т. Е. Если path == null обычно происходит, только если разработчик, использующий вашу функцию, допустил ошибку, то используйте исключение.
2 голосов
/ 23 января 2011

Вы никогда не должны использовать исключения как форму управления потоком.

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

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

1 голос
/ 23 января 2011

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

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

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

1 голос
/ 23 января 2011

Как исключительный это событие?Бросание и отлов исключений повлечет за собой накладные расходы, которые вы, возможно, не захотите принимать в общем использовании.

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

Головная боль в таких сценариях заключается в том, что можно игнорировать или неправильно использовать возвращаемое значение (обычно false или null).

0 голосов
/ 23 января 2011

Это зависит от того, что вы считаете «ложным» состоянием исключительным или нет.Или, другими словами, обычно не ожидается.

Например, если вы передаете объект методу, который не имеет никакого смысла, если метод не выполняет свою работу, то, возможно, вам следует броситьArgumentNullException:

public void Foo(object obj)
{
    if(obj == null) throw new ArgumentNullException("obj", "Object cannot be null.");

    //
}
0 голосов
/ 23 января 2011

Я люблю исключения.Я просто делаю.Конечно, это зависит от того, где вы реализуете.

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

Приятной особенностью C # является то, что вам не нужно перехватывать каждое исключение, потому что оно просто выбрасывает его дальше, если оно идет не так.Так что это сэкономит вам много кода.Еще с булевыми значениями это будет: if false -> return false; if false -> return false;.Я думаю, , что было бы излишним.

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

Я бы пошел на это.

0 голосов
/ 23 января 2011

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

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

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