Аналогично, я не нашел ничего, что бы автоматически выводило параметры во время выполнения. Вместо этого я использовал надстройку Visual Studio для генерации кода, который явно упаковывает параметры, например:
public class ExceptionHandler
{
public static bool HandleException(Exception ex, IList<Param> parameters)
{
/*
* Log the exception
*
* Return true to rethrow the original exception,
* else false
*/
}
}
public class Param
{
public string Name { get; set; }
public object Value { get; set; }
}
public class MyClass
{
public void RenderSomeText(int lineNumber, string text, RenderingContext context)
{
try
{
/*
* Do some work
*/
throw new ApplicationException("Something bad happened");
}
catch (Exception ex)
{
if (ExceptionHandler.HandleException(
ex,
new List<Param>
{
new Param { Name = "lineNumber", Value=lineNumber },
new Param { Name = "text", Value=text },
new Param { Name = "context", Value=context}
}))
{
throw;
}
}
}
}
РЕДАКТИРОВАТЬ: или, альтернативно, путем присвоения параметру HandleException массива params:
public static bool HandleException(Exception ex, params Param[] parameters)
{
...
}
...
if (ExceptionHandler.HandleException(
ex,
new Param { Name = "lineNumber", Value=lineNumber },
new Param { Name = "text", Value=text },
new Param { Name = "context", Value=context}
))
{
throw;
}
...
Трудно создать дополнительный код для явной передачи параметров в обработчик исключений, но с помощью надстройки вы можете, по крайней мере, автоматизировать его.
Пользовательский атрибут может использоваться для аннотирования любых параметров, которые вы не хотите, чтобы надстройка передавала обработчику исключений:
public UserToken RegisterUser( string userId, [NoLog] string password )
{
}
2-е РЕДАКТИРОВАНИЕ:
Имейте в виду, я бы полностью забыл про AVICode:
http://www.avicode.com/
Они используют методы перехвата вызовов, чтобы предоставить именно такую информацию, поэтому это должно быть возможно.