到目前为止,我正在记录错误消息和异常的堆栈跟踪.但是,如果我不记录try块中使用的所有变量,我认为这样做并不是很有帮助.如果我能看到try块中使用的所有变量,我想我会更好地了解导致异常的原因,并且我可以避免它再次发生.
你们有什么记录?
谢谢
正如其他人所说,当记录异常时,我通常会记录exception.ToString(),通常只包含消息,堆栈跟踪和内部异常.
然而,定义的属性System.Exception经常被遗忘,但可能正是您正在寻找的.这是IDictionary Data财产.在该词典中,您可以放置任何您想要的内容,然后在记录异常时使用它.
这是一个带有错误函数的简短示例,另一个使用它的函数,以及每当有未捕获异常展开堆栈时调用的方法:
public static int BuggyFoo(int notZeroPlease)
{
return 5 / notZeroPlease;
}
public static int UseBuggyFoo(int userInput)
{
var myValue = userInput >> 2;
try
{
var foo = BuggyFoo(myValue);
return (foo + 5);
}
catch (Exception e)
{
e.Data["userInput"] = userInput;
e.Data["myValue"] = myValue;
throw;
}
}
public static void Application_OnError(Exception e)
{
var sb = new StringBuilder();
foreach (var k in e.Data.Keys)
{
sb.AppendFormat("Data[{0}] = {1}\n", k, e.Data[k])
}
Utilities.Logger.Log(sb.ToString(), e);
}
Run Code Online (Sandbox Code Playgroud)
但这应该适度使用...否则(如果您的代码有问题),您将拥有巨大的日志文件!
祝好运!
编辑:如果你不确定这个Application_OnError()方法,这里有一个可能的例子:
public static void Application_OnError(Exception e)
{ /* ... */ }
public static void Main()
{
try
{
/* ... */
}
catch (Exception e)
{
Application_OnError(e);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您正在使用ASP.NET创建Web应用程序,那么您应该已经拥有了在这些情况下将被调用的Application_OnError方法.