是否可以捕获Object引用上的哪个对象未设置为对象的实例。错误

时间:2014-07-09 11:19:27

标签: c# asp.net error-handling runtime-error

我有一个带有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)

非常感谢您的回答。

3 个答案:

答案 0 :(得分:3)

NullReferenceException不包含有关null变量的信息,没有。

  

它没有提供有关它是哪个对象的任何信息。

只是它......它不是一个对象。它是对物体预期位置的参考,但那里没有物体。 null确实缺乏信息。

处理NullReferenceException的方法是仔细制作代码,以便:

  1. 它没有发生,或
  2. 它以一种潜在的预期方式发生,你检查它并抛出一个自定义信息异常(它只能是一个NullReferenceException只有一个自定义消息)或者以某种方式记录/保存信息和有意义地继续执行该应用程序。
  3. 由于没有任何代码或开发人员是完美的,所以完全可以预期会不时地通过检查和平衡。还行吧。在这种情况下, 应该很容易识别哪个对象是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并使用内部异常和堆栈跟踪抛出错误,以便您可以记录该错误并获取有关特定错误的更多信息。