Questa domanda è destinata a qualsiasi linguaggio di programmazione OO che supporti la gestione delle eccezioni; Sto usando C # solo a scopo illustrativo.
Le eccezioni sono generalmente intese per essere sollevate quando sorge un problema che il codice non può gestire immediatamente, e quindi per essere catturate in una catch
clausola in una posizione diversa (di solito un frame stack esterno).
D: Esistono situazioni legittime in cui le eccezioni non vengono generate e catturate, ma semplicemente restituite da un metodo e quindi passate in giro come oggetti di errore?
Questa domanda mi è venuta in mente perché il System.IObserver<T>.OnError
metodo .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 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 System.Component.DataAnnotations
spazio dei nomi fa qualcosa di abbastanza simile.)
Questi tipi potrebbero essere impiegati 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>
}
D: Quali sono i vantaggi e gli svantaggi di questi due approcci diversi?
AggregateException
? Buon punto.