引发异常时要记录的内容

iJK*_*iJK 1 c# asp.net

到目前为止,我正在记录错误消息和异常的堆栈跟踪.但是,如果我不记录try块中使用的所有变量,我认为这样做并不是很有帮助.如果我能看到try块中使用的所有变量,我想我会更好地了解导致异常的原因,并且我可以避免它再次发生.

你们有什么记录?

谢谢

Bru*_*eis 5

正如其他人所说,当记录异常时,我通常会记录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方法.