技术开发 频道

asp.net错误处理总则



  装备应用程序帮助管理员跟踪错误

  虽然向客户显示定制的错误信息是一件好事,但也许你还是希望,当一个错误在站点上发生时,开发人员和管理员能够很容易地实时发现它,并且识别出是什么问题、url及例外信息是什么。

  为了解决这个问题,ASP.NET引入了一个可以在Global.asax文件中处理的新的“应用程序层”事件:“Application_Error”。在处理一个web请求的过程中,当有一个未处理的例外发生时,这个方法就被调用。开发人员从中可以获得有关请求的特殊信息,例如:要弹出页面的url、查询字符串变量、用户代理、cookie的值等等,以及封装错误信息的实际例外对象的信息。然后就可以继续进行,运行任何他们想要跟踪以及用来通知管理员和开发人员有关问题的逻辑,这可能包括使用 System.Diagnostic APIs向NET事件日志写入信息、使用System.Web.Util SMTP Email APIs向管理员发email、向一个数据库中写入信息等等。

  举例说明,以下的Global.asax文件演示了如何向一个定制NT事件日志“MyCustomLog”写入错误信息,包括页面url和例外堆栈记录:
<%@ Import Namespace="System.Diagnostics" %> <script language="VB" runat=server> Sub Application_Error(Sender As Object, E as EventArgs) Obtain the URL of the Request Dim PageUrl as String = Request.Path Obtain the Exception Object for the Error Dim ErrorInfo as Exception = Server.GetLastError() Construct Error Message to Write to NT Event Log Dim Message As String = "Url " & PageUrl Message = Message & " Error: " Message = Message & ErrorInfo.ToString NT Event Log Name to Write Message To Dim LogName As String = "MyCustomLog" Create Event Log if It Doesn’t Exist If (Not EventLog.SourceExists(LogName)) Then EventLog.CreateEventSource(LogName, LogName) End if Fire off to Event Log Dim Log as New EventLog Log.Source = LogName Log.WriteEntry(Message, EventLogEntryType.Error) End Sub </script>
  要想看到上门所描述的一切实际是如何工作的,试着在机器上创建一个新的IIS应用程序vroot,然后将上面的样本代码复制到一个新的 “Global.asax”文件中,这个文件是在应用程序根目录中创建的。然后,将以下代码片段复制/粘贴到“Blowup.aspx”文件中:
<html> <body> <% Dim x x.BlowUp() %> </body> </html>
  注意,这个文件总是会引起一个运行时间错误,因为其中引起了一个无效引用例外,而“x”对象根本就没有创建,也没有“Blowup”方法。因此,当你用浏览器点击页面,将看到一个错误信息时。

  除了在浏览器内看到错误信息外,由于Global.asax内部存在Application_Error事件,你还会在NT 事件日志中看到它。要查看这点,请选择“开始菜单->程序->管理工具->事件查看器”,然后点击右侧的“MyCustomLog”节点,就会显示出日志的内容。在其内部特定项目上双击就可以看到页面的url以及堆栈的记录细节。

  注意:NT事件日志可以远程查看,因此这是一个从远处跟踪机器状态的简便方法。还要注意:当你动态创建一个新的NT事件日志时,为了看到它在列表中显示出来,必须每次都退出并重新启动NT事件查看器。

  既然当新的ASP.NET 应用程序内部发生问题时,我们能够轻松地跟踪错误的细节,现在我们就要确保我们的客户所看到的只是友好的定制错误信息。这就要在vroot中创建一个“CustomError.aspx”页面:
<html> <body> <h1> My Custom Error Page</h3> <h3> Todo: Make this pretty.... </h3> </body> </html>
  然后修改config.web文件,让它指向这个页面:
<configuration> <customerrors mode="on"defaultredirect="CustomError.aspx"/> </configuration>
  这时请再次点击BlowUp.aspx页面,你会看到浏览器被自动重定向到友好的错误页面。如果你查看NT事件日志的话,会看到关于这个错误对一个管理员进行通知时必要的所有细节,以及开发人员要识别和修复它所必要的所有细节。

  要注意,由于客户信息信息被存储在config.web 文件而不是IIS元数据中,因此它可以通过“xcopied”进行安装,而不需要请求用户使用IIS Admin 工具。ASP.NET的这种客户定制功能在IIS4 和IIS5中也同样奏效。
0
相关文章