Esta pregunta está destinada a aplicarse a cualquier lenguaje de programación OO que admita el manejo de excepciones; Estoy usando C # solo con fines ilustrativos.
Por lo general, las excepciones están destinadas a surgir cuando surge un problema que el código no puede manejar de inmediato, y luego quedar atrapado en una catch
cláusula en una ubicación diferente (generalmente un marco de pila externo).
P: ¿Hay situaciones legítimas en las que no se generan y capturan excepciones, sino que simplemente se devuelven de un método y luego se pasan como objetos de error?
Esta pregunta se me ocurrió porque el System.IObserver<T>.OnError
método de .NET 4 sugiere exactamente eso: las excepciones se pasan como objetos de error.
Veamos otro escenario, la validación. Digamos que estoy siguiendo la sabiduría convencional y que, por lo tanto, estoy distinguiendo entre un tipo de objeto de error IValidationError
y un tipo de excepción separado ValidationException
que se utiliza para informar errores inesperados:
partial interface IValidationError { }
abstract partial class ValidationException : System.Exception
{
public abstract IValidationError[] ValidationErrors { get; }
}
(El System.Component.DataAnnotations
espacio de nombres hace algo bastante similar).
Estos tipos podrían emplearse de la siguiente manera:
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(…)
}
Ahora me pregunto, ¿no podría simplificar lo anterior a esto?
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: ¿Cuáles son las ventajas y desventajas de estos dos enfoques diferentes?
AggregateException
lugar? Buen punto.