我有一个带有C#的ASP.net网站。目前的框架是4.5
我有一个全局意外错误捕获功能。
它位于global.asax
这是我如何抓住
void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
if (Server.GetLastError() != null)
if (Server.GetLastError().GetBaseException() != null)
{
Exception objErr = Server.GetLastError().GetBaseException();
ErrorLogger.LogError(Request.Url.ToString(), objErr.Message.ToString(), objErr.StackTrace.ToString());
if (objErr.Message.IndexOf("does not exist") != -1)
{
Response.RedirectPermanent("Error404.aspx");
}
}
}
现在它捕获错误,很多时候有大量信息来调试错误。但是有一个错误,我无法获得足够的信息。
是Object reference not set to an instance of an object.
它没有提供有关它是哪个对象的任何信息。有没有办法获得更多相关信息?
这是一个典型的错误
Object reference not set to an instance of an object.
at gamepage.Page_Load(Object sender, EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
非常感谢您的回答。
答案 0 :(得分:3)
NullReferenceException
不包含有关null
变量的信息,没有。
它没有提供有关它是哪个对象的任何信息。
只是它......它不是一个对象。它是对物体预期位置的参考,但那里没有物体。 null
确实缺乏信息。
处理NullReferenceException
的方法是仔细制作代码,以便:
NullReferenceException
只有一个自定义消息)或者以某种方式记录/保存信息和有意义地继续执行该应用程序。由于没有任何代码或开发人员是完美的,所以完全可以预期会不时地通过检查和平衡。还行吧。在这种情况下, 应该很容易识别哪个对象是null
。堆栈跟踪应该指向一个特定的方法(甚至可能是特定的代码行,具体取决于运行时可用的信息)并且不应该是一大堆潜在的{{ 1}}那里。如果有的话,方法很草率,无论如何应该清理。
发生这种情况时,通过调试和调查确定NullReferenceExceptions
对象,并更新代码以处理该对象的潜在null
案例。
答案 1 :(得分:1)
有助于追踪问题的一件事是找到错误的方法,甚至可能通过执行运行时堆栈跟踪找到其中的代码行,例如:
var st = new StackTrace();
var errorInfo = String.Join("...", st.GetFrames().Select(x =>
{
var m = x.GetMethod();
var t = m.DeclaringType;
return String.Format("{0}.{1} @ {2}:{3}:{4}", t == null ? "" : t.Name, m.Name, x.GetFileName(), x.GetFileLineNumber(), x.GetFileColumnNumber());
});
这将允许您找到代码并修复它。我没有在全局错误陷阱中使用这种方法,例如您正在使用的Application_Error事件处理程序,但我已经使用此方法来查看调用在其他方案中的成功来源,通常用于跟踪事件处理程序订阅了一个活动。
答案 2 :(得分:0)
当您使用任何对象时使用try..catch并使用内部异常和堆栈跟踪抛出错误,以便您可以记录该错误并获取有关特定错误的更多信息。