С нашим общедоступным SDK мы стремимся давать очень информативные сообщения о том, почему возникает исключение. Например:
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);
}
Однако, это имеет тенденцию загромождать поток кода, так как он имеет тенденцию уделять большое внимание сообщениям об ошибках, а не тому, что делает код.
Коллега начал рефакторинг некоторых исключений, бросая что-то вроде этого:
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);
}
Что облегчает понимание логики кода, но добавляет множество дополнительных методов для обработки ошибок.
Каковы другие способы избежать проблемы "логики беспорядка длинных сообщений об исключениях"? Я в первую очередь спрашиваю об идиоматическом C # / .NET, но как другие языки управляют им, также полезно.
[Редактировать]
Было бы неплохо иметь плюсы и минусы каждого подхода.
Exception.Data
свойства, «выборочной» перехвата исключений, перехвата кода и добавления собственного контекста вместе с перехваченным стеком вызовов - все это вносит информацию, которая должна позволять гораздо меньше многословных сообщений. Наконец, System.Reflection.MethodBase
выглядит многообещающим для предоставления деталей для перехода к вашему методу "создания исключений".
Exception.Data
. Акцент должен быть захват телеметрии. Рефакторинг здесь хорошо, но он не решает проблему.