Мне недавно сказали, что я злоупотребляю исключениями для управления потоком в моих приложениях, поэтому я пытаюсь как-то прояснить ситуацию.
На мой взгляд, метод должен генерировать исключение, когда он сталкивается с ситуацией, которая не может быть обработана внутренне или может быть обработана лучше вызывающей стороной.
Итак - существует ли какой-либо конкретный набор правил , который можно использовать для ответа на следующий набор вопросов при разработке ваших приложений:
Когда мне следует генерировать исключение и когда писать код с строгой гарантией 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
, чтобы указать успех или неудачу операций.
Спасибо!