【问题标题】:Is it possible to write a base class to handle nullReferenceException from all pages?是否可以编写一个基类来处理所有页面的 nullReferenceException ?
【发布时间】:2012-03-01 02:59:46
【问题描述】:

我正在使用 .net 框架 4.0、纯 asp.net 并使用 webform。目前我有一个基类来处理所有参数传递和重定向。我想知道是否可以编写一个基类来一次处理所有页面的 nullRefeerenceException,比如说将最终用户重定向到某个地方或显示特定的错误消息。

场景:比如有些页面必须带参数,如果没有捕获到参数,我想重定向到某个地方。

【问题讨论】:

  • 重定向到错误页面是个坏主意。您应该使用适当的错误代码显示错误(在您的情况下为 5xx,因为它是服务器中的错误)
  • 还有一个重要的问题,即您使用的是 asp.net 的哪个部分。普通的 asp.net、WebForms、Asp.net MVC 还是其他一些框架?
  • @CodeInChaos 我在示例广告中添加
  • 你还是没有说你用的是哪个框架。 Asp.net MVC 中的输入验证与 WebForms 等的工作方式非常不同。
  • 对此感到非常抱歉并再次更新。我不知道这可能是非常重要的问题并导致差异。谢谢你告诉我。

标签: asp.net .net c#-4.0 nullreferenceexception base-class


【解决方案1】:

当服务器处理 NullReferenceException 时,会创建 500 响应。根据需要重定向所有服务器 500 消息。本指南将有所帮助。

Definitive Guide to Handling 500 Errors in IIS6, IIS7, ASP.NET MVC3 with Custom Page

【讨论】:

    【解决方案2】:

    您可以尝试控制 ProcessRequest。您需要对其进行测试以查看是否可以完成您要求的工作,但这是捕获页面所有错误的好方法。

    public override void ProcessRequest(HttpContext context)
    {
        try
        {
            base.ProcessRequest(context);
        }
        catch (Exception x)
        {
            // handle here your error from the page...
        }
    }
    

    还有一些注意事项

    我曾在一个关键页面上使用此代码,但我并没有将它用于我的所有页面。即使您可以捕获错误,有时您也无法在此处执行任何其他操作,只能再次抛出最终错误,因此最好从globa.asaxApplication_Error 记录您的未知和未处理的错误,并在页面上确保你使用try/catch 来处理它们发生的地方。

    经过一些人认为使用它可能不是一个好习惯。好的做法是在你可能有 throws 的地方使用 try/catch,而不是像这样的一般地方。

    最后

    当用户在渲染结束之前关闭连接时,您也会在此处收到 throw 错误,但如果您记录错误,您会在 Application_Error 上得到相同的错误 - 这不是页面错误。

        Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> 
       System.Web.HttpException: The remote host closed the connection. 
       The error code is 0x80072746.
    

    【讨论】:

    • 太好了,这可能是我正在寻找的东西!你有什么例子吗?
    • 使用 3xx 重定向是个坏主意。您应该直接返回错误代码,并呈现错误页面。
    • @SƲmmērAƥ 这就是例子!和工作代码。我用过,效果很好。
    • @CodeInChaos 这是一个例子,你可以随心所欲。这个想法是我回答,捕捉页面过程的点。
    • 示例代码的问题是人们会复制和粘贴它而只做很少的改动。所以我尽量避免不良做法,尤其是在示例代码中。
    【解决方案3】:

    在你的 Global.asax 中,处理 Application_Error。

    【讨论】:

      【解决方案4】:

      您可以连接到每个未捕获的 NullReference 异常,具体取决于您要执行的操作。

      例如,您可以使用 global.asax,具体来说是 Application_Error 事件。您可以获得对异常的引用,查找类型并在那里执行重定向。

      另一种获取异常的方法是编写您的自定义错误提供程序,但这不会让您有可能执行重定向。

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 2017-10-24
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-16
        相关资源
        最近更新 更多