asp.net - 有没有一种方法可以在全局ASP.Net异常中显示变量值?

标签 asp.net error-handling

我在Global.asax的Application_Error方法中有一个全局错误陷阱,该陷阱将任何未处理的异常写入日志文件。

无论如何,有没有将变量名及其值作为异常报告的一部分进行报告?

最佳答案

除非您对面向方面的编程做一些真正棘手的事情,否则您非常需要确保在引发异常时手动将任何相关信息引入堆栈跟踪。例如:

public void DoSomething(int number, string name)
{
    try
    {
        ...
    } 
    catch (Exception e)
    {
        throw new Exception("Error occurred while doing something: " +
                            new {number, name}, e);
    }
}

这样,当此异常向上传播到顶层时,数字和名称将包含在堆栈跟踪中。

编辑

阅读了大卫·斯特拉顿(David Stratton)的回答后,我觉得有必要对此进行一些扩展。我感觉到,即使是一些非常有经验的C#程序员都没有学到我学到的一些技巧。

首先,我想指出的是,.NET中的异常处理系统是专门为这个目的而设计的InnerException(在堆栈跟踪的各个位置提供附加信息)而设计的,它一点也不难去做。但是,您绝对应该将异常作为innerException构造函数参数提供,而不是将e.ToString()附加到新异常的消息中。

其次,根据我在StackOverflow上阅读的各种评论和答案以及我自己的经验,最好做到以下几点:
  • 如果您没有打算处理的异常,请避免捕获异常。
  • 当您捕获异常时,请重新抛出该异常,除非您知道抛出异常的原因,并且您所处的范围内您知道如何优雅地撤退尝试执行的操作。仅仅假装没有出毛病就是在路上要求更多的麻烦。
  • 重新引发异常时,可以只使用throw;保留原始异常的堆栈跟踪,也可以将原始异常包括为新异常的InnerException
  • 始终记录不会重新抛出的异常。通常,这只会在UI级别上发生,因此您可以告诉用户发生了意外情况,而不是使程序崩溃。

  • 最后,我想提一下,匿名类型声明语法非常适合这种情况,因为它非常简洁,并且会自动生成一个使用给定变量名和值的字符串。例如,new {number, name}.ToString()可能会产生“{number = 1,name = Test}”。

    关于asp.net - 有没有一种方法可以在全局ASP.Net异常中显示变量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4796761/

    相关文章:

    c# - 母版页链接的背景颜色在 Internet Explorer 中发生变化,但在 Mozilla Firefox 中不起作用

    javascript - 如何在页面加载时弹出对话框

    c# - Oracle 上的 DbParameter : No replacement

    c# - 使用 ASP.NET 和表单例份验证的 Cryptography.ProtectedData CurrentUser

    javascript - 选择时如何更改菜单颜色?

    excel - 在Excel VBA中访问CheckBox的值时如何解决运行时错误424?

    exception-handling - 如何将一般异常(exception)记录到事件日志?

    Swift 惯用的错误检查

    c++ - 使用 QIODevice 的阻塞接口(interface)(QTcpSocket 和 QFile)时何时检查错误

    python - 'with open(file):'与手动打开/关闭它之间的性能差异