Этот вопрос предназначен для применения к любому языку программирования ОО, который поддерживает обработку исключений; Я использую C # только в иллюстративных целях.
Исключения обычно предназначены для возникновения, когда возникает проблема, что код не может быть обработан немедленно, а затем для перехвата в catch
предложении в другом месте (обычно это кадр внешнего стека).
Вопрос: Существуют ли допустимые ситуации, когда исключения не генерируются и перехватываются, а просто возвращаются из метода, а затем передаются как объекты ошибок?
Этот вопрос возник у меня, потому что System.IObserver<T>.OnError
метод .NET 4 предполагает именно это: исключения передаются как объекты ошибок.
Давайте посмотрим на другой сценарий, проверка. Допустим, я следую общепринятому мнению и поэтому я различаю тип объекта ошибки IValidationError
и отдельный тип исключения, ValidationException
который используется для сообщения о непредвиденных ошибках:
partial interface IValidationError { }
abstract partial class ValidationException : System.Exception
{
public abstract IValidationError[] ValidationErrors { get; }
}
(Пространство System.Component.DataAnnotations
имен делает нечто очень похожее.)
Эти типы могут быть использованы следующим образом:
partial interface IFoo { } // an immutable type
partial interface IFooBuilder // mutable counterpart to prepare instances of above type
{
bool IsValid(out IValidationError[] validationErrors); // true if no validation error occurs
IFoo Build(); // throws ValidationException if !IsValid(…)
}
Теперь мне интересно, не мог бы я упростить вышесказанное до этого:
partial class ValidationError : System.Exception { } // = IValidationError + ValidationException
partial interface IFoo { } // (unchanged)
partial interface IFooBuilder
{
bool IsValid(out ValidationError[] validationErrors);
IFoo Build(); // may throw ValidationError or sth. like AggregateException<ValidationError>
}
В: Каковы преимущества и недостатки этих двух разных подходов?
AggregateException
вместо? Хорошая точка зрения.