是否有可能在object引用上捕获未设置为对象实例的对象.错误

本文关键字:对象 设置 实例 错误 有可能 object 引用 是否 | 更新日期: 2023-09-27 18:12:12

我有一个ASP.net网站与c#。当前框架是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)

非常感谢您的回答

是否有可能在object引用上捕获未设置为对象实例的对象.错误

A NullReferenceException没有携带变量null的信息,没有。

它没有给出任何关于它是哪个对象的信息。

就是这样…它不是对象。它是一个指向对象的引用,但是那里没有对象。null的字面意思是信息缺失。

处理NullReferenceException的方法是仔细编写代码,以便:

  1. 没有发生,或者
  2. 它以一种潜在的预期方式发生,你检查它并抛出一个自定义信息异常(它仍然可以是一个简单的自定义消息的NullReferenceException)或以某种方式记录/持久化信息并有意义地继续执行应用程序。

由于没有代码或开发人员是完美的,因此完全可以预料到,有时会有人通过检查和平衡。这没关系。在这种情况下,应该很容易识别哪个对象是null。堆栈跟踪应该指向特定的方法(甚至可能是特定的代码行,这取决于运行时可用的信息),并且不应该在那里有很多潜在的NullReferenceExceptions。如果有,那么这个方法就是草率的,无论如何都应该清理干净。

当这种情况发生时,通过调试和调查确定为null的对象,并更新代码以处理该对象的潜在null情况

您可以帮助跟踪问题的一件事是找到出错的方法,甚至可能通过执行运行时堆栈跟踪来找到其中的代码行,例如:

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事件处理程序)中使用这种方法,但是我已经成功地使用这种方法来查看其他场景中的调用来自何处,通常用于跟踪订阅事件的事件处理程序。

在使用任何对象时使用try..catch并抛出带有内部异常和堆栈跟踪的错误,以便您可以记录该错误并获得有关特定错误的更多信息。