Создайте исключение, чтобы предоставить дополнительную информацию (тип исключения, сообщение и т. Д.) Для правильной обработки и указать, что:
- ваш код используется не по назначению / незаконно
- т. е. против договорных ограничений, которые не могут быть применены во время компиляции
- произошла альтернатива первичному потоку
- т.е. вы ожидали, что операция будет выполнена успешно, но она завершилась неудачно, напримерполучение ресурса или соединения
Я бы на самом деле не рекомендовал возвращать «объекты журнала» (т. е. возвращать объект исключения, а не выбрасывать его) как этот
- приводит к ненужным наборам операторов
if
для проверки результата и обработки потенциальной ошибки - все ваши методы должны будут возвращать "объект журнала" (или иметь параметр
out
), иначе выне может "всплыть" из-за ошибки / исключения при обработке по областям, что приводит к дополнительным ограничениям
- теряет полезность try / catch / finally
- ухудшает читаемость области (попытка операции или обработка ошибок и очистка)
Если вы хотите вернуть «объекты журнала», вам следуетдействительно используйте логические возвраты с методами, которые имеют смысл (например, FindCity
) или методами с out
логическим параметром (например, TryFindCity
).Таким образом, вам не нужно указывать флаги, а просто используйте методы, логический возврат которых позволяет вам определить значение потенциального флага.
EDIT
Согласно комментарию OP, если существует гигантский метод с многочисленными возможными ошибками проверки, то гигантский метод должен быть реорганизован для вызова меньших методов, каждый из которых выдает соответствующее исключение.Затем гигантский метод может просто перебрасывать каждое исключение или просто разрешать пузыриться каждому исключению, если оно не должно обрабатываться тем, которое его обрабатывает.
Если существуют валидационные зависимости, которые препятствуют «правильному разделению», тогда простобросьте один ValidationException
с правильным аргументом (ами).Ниже приведен пример того, каким может быть этот класс:
public class ValidationException : Exception {
private readonly object _Field;
public object Field { get { return _Field; } }
public ValidationException(string message) : base(message) { }
public ValidationException(string message, object field)
: this(message) {
_Field = field;
}
}
Затем вы можете просто выдать одно исключение, объясняющее ошибку проверки.