Avec notre SDK public, nous avons tendance à vouloir donner des messages très informatifs sur les raisons pour lesquelles une exception se produit. Par exemple:
if (interfaceInstance == null)
{
string errMsg = string.Format(
"Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.",
ParameterInfo.Name,
ParameterInfo.ParameterType,
typeof(IParameter)
);
throw new InvalidOperationException(errMsg);
}
Cependant, cela a tendance à encombrer le flux du code, car il a tendance à mettre l'accent sur les messages d'erreur plutôt que sur ce que fait le code.
Un collègue a commencé à refactoriser une partie de l'exception en lançant quelque chose comme ceci:
if (interfaceInstance == null)
throw EmptyConstructor();
...
private Exception EmptyConstructor()
{
string errMsg = string.Format(
"Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.",
ParameterInfo.Name,
ParameterInfo.ParameterType,
typeof(IParameter)
);
return new InvalidOperationException(errMsg);
}
Ce qui rend la logique du code plus facile à comprendre, mais ajoute de nombreuses méthodes supplémentaires pour gérer les erreurs.
Quelles sont les autres façons d'éviter le problème de la "logique d'encombrement des messages à longue exception"? Je pose principalement des questions sur C # /. NET idiomatique, mais comment les autres langages le gèrent également.
[Éditer]
Ce serait bien d'avoir les avantages et les inconvénients de chaque approche également.
Exception.Data
propriété, de la capture d'exceptions "pointilleuse", de la capture de code et de l'ajout de son propre contexte, ainsi que de la pile d'appels capturés, fournissent toutes des informations qui devraient permettre des messages beaucoup moins verbeux. System.Reflection.MethodBase
Semble enfin prometteur pour fournir des détails à passer à votre méthode de "construction d'exception".
Exception.Data
. L'accent devrait être mis sur la capture de la télémétrie. Refactoring ici est bien, mais il manque le problème.