代码之家  ›  专栏  ›  技术社区  ›  juan

ASP.NET Web窗体中的异常处理

  •  9
  • juan  · 技术社区  · 15 年前

    在ASP.NET Web窗体中,处理异常的首选方法是什么?

    您有在web.config级别添加的page-error方法,当出现错误时,整个站点都会被重定向到那里。

    这是否意味着您不应该在webforms应用程序中使用try-catch?(假设您不想隐藏任何错误)

    5 回复  |  直到 10 年前
        1
  •  12
  •   Andrew Hare    15 年前

    只捕获可以处理的错误。如果您能够以允许页面继续加载的方式处理它们,那么就这样做。任何其他会破坏页面的异常都不应该在任何控件或页面中处理,因为您无论如何都不能做任何事情。让它转到global.asax处理程序,并确保记录异常。

        2
  •  4
  •   Dillie-O    15 年前

    除了Andrew的建议之外,请确保更新web.config文件以将customErrors设置为“on”,并指定一个通用错误页来重定向这些顶级错误。Global_ASAX仍会记录错误,然后用户可以看到一个友好的页面。它还允许您配置一些标准类型错误,例如404S和200S,以及更多的错误。

        3
  •  2
  •   PRR    15 年前
    • Web应用程序通常由UI、业务和数据访问层组成,每一层都必须在异常处理方面发挥作用。每个层(为了代码的可重用性)必须检查错误条件和包装异常(在记录异常之后),并可能传播到调用层。UI层应该隐藏异常并显示友好消息。在UI中捕获所有异常可能不是一个好主意。如果可能,异常应记录在数据库中。这样可以方便地维护和纠正错误。

    • 尽量避免捕获异常。在使用之前,请尝试验证所有输入。必须在验证控件、自定义控件和正则表达式的帮助下严格验证(客户端和服务器端)输入。

      string fname = "abc";
      //Always check for condition, like file exists etc...
      if (System.IO.File.Exists(fname))
      {
      
      }
      else
      {
      
      }
      
    • 始终确保调用了清除代码。使用语句或尝试finally。

    • 您可以捕获global.asax(ASP.NET应用程序文件)中的所有异常。

      void Application_Error(object sender, EventArgs e) 
      { 
          // Code that runs when an unhandled error occurs
          Exception objErr = Server.GetLastError().GetBaseException();
          string err = "Error Caught in Application_Error event\n" +
             "Error in: " + Request.Url.ToString() +
             "\nError Message:" + objErr.Message.ToString()+ 
             "\nStack Trace:" + objErr.StackTrace.ToString();
          EventLog.WriteEntry("Sample_WebApp",err,EventLogEntryType.Error);
          Server.ClearError();
          //additional actions...
      
      }
      

    并添加 <customerror> Web配置中用于将用户重定向到单独页面的部分

        <customErrors defaultRedirect="error.htm" mode="On">
        </customErrors>
    
        4
  •  0
  •   Alex Reitbort    15 年前

    您应该在可以用错误来做有意义的事情的地方使用Try/Catch,比如修复错误或采用不同的方法。

    对于所有其他情况,您应该使用web.config自定义错误页面或应用程序的全局try/catch来记录错误,并可能向用户显示错误。

        5
  •  0
  •   Middletone    15 年前

    如果您使用验证控件,或者检查和验证代码中的用户输入,这将对防止错误有很大的帮助。我确实建议有一个通用的错误页面,可以为您记录错误。如果您不确定会发生什么,我建议您捕获错误并尽可能地处理它,并在执行之前找到一种方法来了解您要运行的内容。

    您是否有一个特定的例子来说明在哪里可能会遇到这种类型的错误?我知道的一个问题是,当一个会话到期时,您将无法再处理该页。在运行任何其他内容之前,我会在每次页面加载时检查此项,然后在发生此情况时重定向用户。