Cette question est destinée à s'appliquer à tout langage de programmation orienté objet prenant en charge la gestion des exceptions; J'utilise C # à des fins d'illustration uniquement.
Les exceptions sont généralement destinées à être déclenchées lorsqu'un problème que le code ne peut pas résoudre immédiatement, puis à être interceptées dans une catch
clause située à un emplacement différent (généralement un cadre de pile externe).
Q: Existe-t-il des situations légitimes dans lesquelles des exceptions ne sont pas levées ni interceptées, mais simplement renvoyées par une méthode, puis transmises en tant qu'objets d'erreur?
Cette question m’a été posée car la System.IObserver<T>.OnError
méthode de .NET 4 le suggère: les exceptions sont transmises comme des objets d’erreur.
Regardons un autre scénario, la validation. Supposons que je suis la sagesse conventionnelle et que je distingue donc un type d'objet d'erreur IValidationError
et un type d'exception distinct ValidationException
utilisé pour signaler des erreurs inattendues:
partial interface IValidationError { }
abstract partial class ValidationException : System.Exception
{
public abstract IValidationError[] ValidationErrors { get; }
}
(L' System.Component.DataAnnotations
espace de nom fait quelque chose d'assez similaire.)
Ces types pourraient être utilisés comme suit:
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(…)
}
Maintenant, je me demande si je ne peux pas simplifier ce qui précède à ceci:
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: Quels sont les avantages et les inconvénients de ces deux approches différentes?
AggregateException
place? Bon point.