Принятый ответ и многие из описанных решений будут работать нормально, но то, что вы делаете, это засоряет ваш источник немного другим кусочком кода в зависимости от того, какие параметры есть в сигнатуре вашего метода.
Когда приходит время добавить новый параметр, вы должны помнить, чтобы обновить ваш обработчик, чтобы добавить этот новый параметр. Или, если вы удалите параметр, то вам нужно не забыть удалить параметр из обработчика исключений.
Что делать, если у вас есть два или более блоков try..catch
? Теперь у вас есть два блока кода, чтобы быть в курсе. Определенно не подходит для рефакторинга.
Другой подход состоит в том, чтобы удалить код регистрации, используя метод, называемый Аспектно-ориентированное программирование .
Одним из таких инструментов для облегчения этого является продукт под названием PostSharp .
С PostSharp вы можете написать регистратор, который вызывается всякий раз, когда генерируется исключение, без необходимости использования грязного метода и кода, специфичного для параметров. Например (используя версию 1.5 PostSharp):
LoggerAttribute.cs -
[Serializable]
public class LoggerAttribute : OnExceptionAspect
{
public override void OnException(MethodExecutionEventArgs eventArgs)
{
Console.WriteLine(eventArgs.Method.DeclaringType.Name);
Console.WriteLine(eventArgs.Method.Name);
Console.WriteLine(eventArgs.Exception.StackTrace);
ParameterInfo[] parameterInfos = eventArgs.Method.GetParameters();
object[] paramValues = eventArgs.GetReadOnlyArgumentArray();
for (int i = 0; i < parameterInfos.Length; i++)
{
Console.WriteLine(parameterInfos[i].Name + "=" + paramValues[i]);
}
eventArgs.FlowBehavior = FlowBehavior.Default;
}
}
Затем вы украшаете свои классы с помощью LoggerAttribute
:
[Logger]
public class MyClass
{
public void MyMethod(int x, string name)
{
// Something that throws an exception
}
}
Все, что вызывает исключение в MyMethod
, приведет к выполнению метода OnException
.
Существует две версии PostSharp. Версия 1.5 является бесплатной и с открытым исходным кодом под лицензией GPL и нацелена на .NET 2.0. PostSharp 2.0 не является полностью бесплатным, но его версия для сообщества будет поддерживать базовые функции, описанные выше.