Dzięki naszemu publicznemu pakietowi SDK chcemy przekazywać bardzo pouczające informacje o przyczynach wyjątku. Na przykład:
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);
}
Ma to jednak tendencję do zaśmiecania przepływu kodu, ponieważ koncentruje się raczej na komunikatach o błędach niż na tym, co robi kod.
Kolega zaczął refaktoryzować niektóre wyjątki, zgłaszając coś takiego:
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);
}
Co sprawia, że logika kodu jest łatwiejsza do zrozumienia, ale dodaje wiele dodatkowych metod obsługi błędów.
Jakie są inne sposoby na uniknięcie problemu logiki zakłóceń długich wyjątków? Pytam przede wszystkim o idiomatic C # / .NET, ale pomocne są również sposoby zarządzania innymi językami.
[Edytować]
Byłoby miło mieć zalety i wady każdego podejścia.
Exception.Datawłaściwości, „wybrednego” wychwytywania wyjątków, wywoływania kodu i dodawania własnego kontekstu, wraz z przechwyconym stosem wywołań, wszystko to zapewnia informacje, które powinny pozwolić na znacznie mniej pełne komunikaty. Wreszcie System.Reflection.MethodBasewygląda obiecująco, podając szczegółowe informacje na temat metody „wyjątkowej konstrukcji”.
Exception.Data. Nacisk należy położyć na przechwytywanie danych telemetrycznych. Refaktoryzacja jest w porządku, ale pomija problem.