该问题旨在适用于任何支持异常处理的OO编程语言。我使用C#仅出于说明目的。
通常会在出现无法立即处理代码的问题时引发异常,然后将异常捕获在catch
其他位置的子句中(通常是外部堆栈框架)。
问:是否有任何合法的情况不会引发并捕获异常,而只是从方法中返回然后将其作为错误对象传递出去?
之所以提出这个问题,是因为.NET 4的System.IObserver<T>.OnError
方法仅表明了这一点:异常作为错误对象传递。
让我们看看另一种情况,验证。假设我遵循传统的观点,因此我在区分错误对象类型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
吗?好点子。