Esta pergunta se aplica a qualquer linguagem de programação OO que suporte o tratamento de exceções; Estou usando C # apenas para fins ilustrativos.
Geralmente, as exceções devem ser levantadas quando surgir um problema que o código não pode tratar imediatamente e, então, serem capturadas em uma catch
cláusula em um local diferente (geralmente um quadro de pilha externo).
P: Existem situações legítimas em que as exceções não são lançadas e capturadas, mas simplesmente retornadas de um método e transmitidas como objetos de erro?
Essa pergunta surgiu para mim porque o System.IObserver<T>.OnError
método do .NET 4 sugere exatamente isso: exceções sendo passadas como objetos de erro.
Vamos olhar para outro cenário, validação. Digamos que estou seguindo a sabedoria convencional e, portanto, estou distinguindo entre um tipo de objeto de erro IValidationError
e um tipo de exceção separado ValidationException
que é usado para relatar erros inesperados:
partial interface IValidationError { }
abstract partial class ValidationException : System.Exception
{
public abstract IValidationError[] ValidationErrors { get; }
}
(O System.Component.DataAnnotations
espaço para nome faz algo bastante semelhante.)
Esses tipos podem ser empregados da seguinte maneira:
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(…)
}
Agora estou me perguntando, não poderia simplificar o acima para isso:
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>
}
P: Quais são as vantagens e desvantagens dessas duas abordagens diferentes?
AggregateException
? Bom ponto.