是否有一种方法可以在全局ASP.Net异常中显示变量值?
我在global.asax的Application_error方法中有一个全局错误陷阱,它将任何未处理的异常写入日志文件是否有一种方法可以在全局ASP.Net异常中显示变量值?,asp.net,error-handling,Asp.net,Error Handling,我在global.asax的Application_error方法中有一个全局错误陷阱,它将任何未处理的异常写入日志文件 是否有必要将变量名及其值作为异常报告的一部分进行报告?除非您在面向方面的编程中做了一些非常棘手的事情,否则您非常需要确保在抛出异常时手动将任何相关信息引入堆栈跟踪。例如: public void DoSomething(int number, string name) { try { ... } catch (Exceptio
是否有必要将变量名及其值作为异常报告的一部分进行报告?除非您在面向方面的编程中做了一些非常棘手的事情,否则您非常需要确保在抛出异常时手动将任何相关信息引入堆栈跟踪。例如:
public void DoSomething(int number, string name)
{
try
{
...
}
catch (Exception e)
{
throw new Exception("Error occurred while doing something: " +
new {number, name}, e);
}
}
这样,当此异常逐渐上升到顶层时,编号和名称将包含在堆栈跟踪中
编辑
在阅读了大卫·斯特拉顿的答案后,我觉得有必要对此进行进一步的阐述。我感觉到,即使是一些非常有经验的C#程序员也没有学会我学到的一些技巧
首先,我想指出.NET中的异常处理系统是专门为这个目的而设计的InnerException
(在堆栈跟踪的各个点上提供额外的信息),它一点也不难做到。但是,您应该明确地将异常作为innerException
构造函数参数提供,而不是将e.ToString()
附加到新异常的消息中
其次,根据我在StackOverflow上读到的各种评论和回答,以及我自己的经验,最好:
throw
保留原始异常的堆栈跟踪,或将原始异常作为新异常的InnerException
包含最后,我想提到的是,匿名类型声明语法非常适合这种情况,因为它非常简洁,并且会自动生成一个使用给定变量名和值的字符串。例如,
new{number,name}.ToString()
可能会生成“{number=1,name=Test}”。我们在某些情况下会这样做,但会以迂回的方式。我们在粒度级别使用try/catch,如果我们想将异常传递给全局错误处理程序,我们将生成错误消息。例如:
public void DoSomething(int number, string name)
{
try
{
...
}
catch (Exception e)
{
throw new Exception("Error occurred while doing something: " +
new {number, name}, e);
}
}
int someCounterValue=0;
string someStringValue=“我们要跟踪的某个字符串,以发送到全局错误处理程序。”
这是一个很大的工作,所以我们真的不经常这样做。通常,我们的错误处理在本地级别处理得更好,但在那些您希望将其传递给全局错误处理程序的情况下,这是我们找到的唯一方法,因为否则变量将超出范围,因此无法访问
一个更简单/不太像黑客的选项是在web应用程序中设置一个名为ErrorLogger或类似的静态类,只需在本地更好地处理异常,并仅在无法在本地执行时将其传递给全局处理程序
在我看来(以及我们在这里通过策略实现的方式),应该使用全局错误处理程序来捕获您忘记在更细粒度级别更好地处理的异常。它不应该仅仅是一种简单的方式,让人们懒于正确的异常处理
而且,我觉得这是一种黑客行为,所以如果有人有更好的选择,我也想知道。哪些变量名和值?哪些变量?你在应用程序中使用的任何局部变量或类变量都将超出范围,因此无法访问。“而且我觉得这是一个黑客行为,所以如果有人有更好的选择,我也希望知道。”:请参阅我答案上的编辑。