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, se pretende que las excepciones se generen cuando surge un problema que el código no puede manejar de inmediato y luego se captura en una cláusula catch
en una ubicación diferente (generalmente un marco de pila exterior).
P: ¿Existen situaciones legítimas en las que las excepciones no se producen y se capturan, sino que simplemente se devuelven desde un método y luego se transmiten como objetos de error?
Esta pregunta se me ocurrió porque el método System.IObserver<T>.OnError
de .NET 4 sugiere precisamente eso : excepciones que 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 usa para informar errores inesperados:
partial interface IValidationError { }
abstract partial class ValidationException : System.Exception
{
public abstract IValidationError[] ValidationErrors { get; }
}
(El System.Component.DataAnnotations
namespace 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 si 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?