Questa domanda è intesa per essere applicata a qualsiasi linguaggio di programmazione OO che supporti la gestione delle eccezioni; Sto usando C # solo per scopi illustrativi.
Solitamente le eccezioni sono intese per essere sollevate quando sorge un problema che il codice non può immediatamente gestire e quindi essere catturato in una clausola catch
in una posizione diversa (di solito una cornice stack esterna).
Q: ci sono delle situazioni legittime in cui le eccezioni non vengono lanciate e catturate, ma semplicemente restituite da un metodo e poi passate in giro come oggetti di errore?
Questa domanda mi è venuta in mente perché il metodo System.IObserver<T>.OnError
di .NET 4 suggerisce proprio questo : le eccezioni vengono passate come oggetti di errore.
Diamo un'occhiata a un altro scenario, la convalida. Diciamo che sto seguendo la saggezza convenzionale e che sto quindi distinguendo tra un tipo di oggetto di errore IValidationError
e un tipo di eccezione separato ValidationException
che viene utilizzato per segnalare errori imprevisti:
partial interface IValidationError { }
abstract partial class ValidationException : System.Exception
{
public abstract IValidationError[] ValidationErrors { get; }
}
(Lo spazio dei nomi System.Component.DataAnnotations
fa qualcosa di molto simile.)
Questi tipi potrebbero essere utilizzati come segue:
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(…)
}
Ora mi chiedo, non potrei semplificare quanto sopra a questo:
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>
}
Q: quali sono i vantaggi e gli svantaggi di questi due diversi approcci?