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.Data
wł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.MethodBase
wyglą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.