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

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

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


Итак - существует ли какой-либо конкретный набор правил , который можно использовать для ответа на следующий набор вопросов при разработке ваших приложений:

  • Когда мне следует генерировать исключение и когда писать код с строгой гарантией nothrow , которая может просто вернуть bool , чтобы указать успех или неудачу?

  • Следует ли мне пытаться минимизировать количество ситуаций, когда метод выдает исключение или, наоборот, следует максимизировать гибкость при обработке этих ситуаций?

  • Должен ли я придерживаться соглашения о выдаче исключений , установленного фреймворками / средами выполнения, которые я использую при разработке своих приложений, или мне следует обернуть все эти вызовы так, чтобы они соответствовали моей стратегии создания исключений?

  • Мне также посоветовали использовать коды ошибок для обработки ошибок, что кажется довольно эффективным, но некрасивым с точки зрения с синтаксической точки зрения (также при их использовании разработчик теряет возможность указать вывод для метода). Что вы думаете об этом?


Пример для третьего вопроса (я использовал структуру ввода-вывода и столкнулся со следующей ситуацией):

Описанная структура действительно не использовать исключения для обработки ошибок, но другой код их использует.Должен ли я завернуть каждую возможную неудачу обозначается '???' и генерирует исключение в этом случае? Или мне следует изменить подпись моего метода на bool PrepareTheResultingOutputPath и только указать, была ли операция успешно или нет?

public void PrepareTheResultingOutputFile(
    String templateFilePath, String outputFilePath)
{
    if (!File.Exists(templateFilePath))
        // ???

    if (!Directory.MakePath(outputFilePath))
        // ???

    if (File.Exists(outputFilePath))
        if (!File.Remove(outputFilePath))
            // ???

    if (!File.Copy(templateFilePath, outputFilePath)
        // ???
}

Другой пример - даже .NET Framework не следует какой-то строгой стратегии генерации исключений. Некоторые методы задокументированы для создания 10+ различных типов исключений, включая тривиальные типы исключений, такие как NullArgumentException , но некоторые из них просто возвращают bool , чтобы указать успех или неудачу операций.

Спасибо!

7
задан Cocowalla 16 February 2012 в 08:06
поделиться