引发异常时要记录的内容

时间:2009-11-09 14:37:21

标签: c# asp.net

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

你们有什么记录?

由于

6 个答案:

答案 0 :(得分: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);
}

但是这应该适度使用...否则(如果你的代码有问题),你会有大量的日志文件!

祝你好运!

修改: 如果您不确定Application_OnError()方法,可以举例说明:

public static void Application_OnError(Exception e)
{ /* ... */ }

public static void Main()
{
    try
    {
        /* ... */
    }
    catch (Exception e)
    {
        Application_OnError(e);
    }
}

如果您正在使用ASP.NET创建Web应用程序,那么您应该已经拥有了在这种情况下将被调用的Application_OnError方法。

答案 1 :(得分:4)

主要是我们记录错误消息和堆栈跟踪。我们还会在日志记录中添加注释,以了解其发生的可能原因。这些消息通常类似于“如果此处失败,则未设置用户会话,并且可能由于会话重置而发生这种情况。”通常情况下,这些信息可以让我们朝着正确的方向前进。

如果你的try catch块太大而无法做到这一点,我会考虑把它分成较小的块。如果您不想这样做,那么我将开始为不同类型的异常设置不同的catch块。

catch(FileNotFoundException ex)
{}
catch(Exception regularException)
{}

通过这种方式,您可以为该类型的异常定制任何其他信息,并将一般异常作为最后一个catch块,以确保不会意外地逃避。

答案 2 :(得分:1)

我总是担心尝试记录方法中的所有内容,主要是因为将来维护代码的维护开销很大。

此外,您可能必须确保您的日志记录代码是上下文感知的,即如果您使用嵌套在对象中的属性,您的日志记录代码将需要了解如何在日志期间获取这些变量,并在此基础上您必须确保记录器可能提出的任何请求不会影响任何状态,或者它不能代表实际状态。

为什么不努力在方法开始时验证参数,然后在需要的地方对代码进行空检查?

答案 3 :(得分:0)

通常我只记录异常消息和堆栈跟踪,我尝试记录足够的调试信息,以便我可以告诉上下文发生了什么。通常这是足够的细节来弄清楚出了什么问题。

如果我无法弄清楚异常是如何发生的,我会添加适用变量值的其他调试日志记录。当然,这只能起作用,因为我可以轻松获得应用程序,并且可以根据需要临时更换程序集。如果没有这种类型的辅助功能,那么您可能需要查看Gibraltar。它提供了大量可以从远程客户端发送的调试信息,并具有各种漂亮的表单来查看它。

答案 4 :(得分:0)

有时,我会将内部异常与主要异常消息一起记录。这可以提供更具体的异常信息,并允许更容易的调试。

答案 5 :(得分:0)

我有一个我称之为'UserAction'的对象,每当用户以某种方式与UI交互时,在列表上推送另一个UserAction,其中包含“clicked x”或“drag p从x到y”等信息。它还包含日期/时间,用户名等信息。当发生异常时,软件会自动通过电子邮件发送异常消息,堆栈跟踪和UserAction日志的转储。尝试重新解决问题可能非常有用。

在用户有机会到我的办公室之前,我通常知道问题是什么。