《第7章异常处理和日志追踪.ppt》由会员分享,可在线阅读,更多相关《第7章异常处理和日志追踪.ppt(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第7 7章章 异常处理和日志追踪异常处理和日志追踪 本章将讨论如何处理本章将讨论如何处理ASP.NET应用程序中的异常、应用程序中的异常、如何追踪错误以及解决一些故障问题。将会讨论结构化异如何追踪错误以及解决一些故障问题。将会讨论结构化异常处理,日志记录以及当出现错误时,如何将用户页面重常处理,日志记录以及当出现错误时,如何将用户页面重定向到一个用户友好的提示页面,本章也将介绍如何使用定向到一个用户友好的提示页面,本章也将介绍如何使用页面追踪和查看页面追踪和查看ASP.NET页面的诊断信息。页面的诊断信息。本章内容有:本章内容有:应用程序异常处理类应用程序异常处理类 如何记录异常如何记录异常
2、 错误页面的使用错误页面的使用 页面的追踪页面的追踪7.1 ASP.NET7.1 ASP.NET应用程序异常处理应用程序异常处理 错误的产生很多时候是开发人员始料未及的,有的错误的产生很多时候是开发人员始料未及的,有的错误可能运行了很久才突然被触发。然而也有一些错误是错误可能运行了很久才突然被触发。然而也有一些错误是由于开发人员的疏漏所造成的,一个简单的例子是被由于开发人员的疏漏所造成的,一个简单的例子是被0除。除。由于由于.NET会先检测本地的错误处理器,因此开发人员会先检测本地的错误处理器,因此开发人员可以设计良好的错误处理方式,比如显示一个友好的信息,可以设计良好的错误处理方式,比如显示
3、一个友好的信息,或者是不显示错误信息而将这些错误记录到事件日志中,或者是不显示错误信息而将这些错误记录到事件日志中,本节将介绍如何使用异常处理机制来处理本节将介绍如何使用异常处理机制来处理ASP.NET应用应用程序中的错误。程序中的错误。7.1.1 7.1.1 异常处理基础异常处理基础 大多数大多数.NET语言都支持结构化异常处理,当一个错误引语言都支持结构化异常处理,当一个错误引发时,发时,.NET框架其实创建了一个异常对象用于呈现问题。开发框架其实创建了一个异常对象用于呈现问题。开发人员可以使用异常处理器来捕捉这个异常对象。假如不使用异人员可以使用异常处理器来捕捉这个异常对象。假如不使用异
4、常处理器的话,用户代码将会被中止,常处理器的话,用户代码将会被中止,ASP.NET将显示一个将显示一个让用户迷惑的错误处理页面。让用户迷惑的错误处理页面。7.1.2 Exception7.1.2 Exception类类 上一节的示例中,当产生了被零除的错误后,上一节的示例中,当产生了被零除的错误后,.NET会会创建一个名为创建一个名为DivideByZeroException的异常对象,的异常对象,catch块中将捕获这个异常对象,并执行处理异常的代码块中将捕获这个异常对象,并执行处理异常的代码块。块。DivideByZeroException是一个派生自是一个派生自Exception的的对象
5、。对象。7.1.3 7.1.3 捕捉异常捕捉异常 通常使用通常使用try/catch语句块来捕捉异常,如语句块来捕捉异常,如7.1.1节中节中的例子所示。当使用的例子所示。当使用catch语句捕捉到一个异常时,都是语句捕捉到一个异常时,都是一个具体类型的异常而不是一个一个具体类型的异常而不是一个Exception这样的异常基这样的异常基类,具体异常用于描述一个指定类型的错误,例如上一节类,具体异常用于描述一个指定类型的错误,例如上一节中的中的DivideByZeroException异常。异常。7.1.4 7.1.4 异常的嵌套异常的嵌套 假定在假定在try块中调用一个来自外部的方法,比如定义
6、块中调用一个来自外部的方法,比如定义了一个用于除法运算的函数,在该函数内部捕捉了了一个用于除法运算的函数,在该函数内部捕捉了DivideByZeroException的异常。然后在另外一个的异常。然后在另外一个try块块中调用这个除法运算的函数,这种方法称为嵌套异常。中调用这个除法运算的函数,这种方法称为嵌套异常。7.1.5 7.1.5 自定义异常自定义异常 如果系统提供的异常类已经不能够满足应用系统开发的如果系统提供的异常类已经不能够满足应用系统开发的需要,或者开发团队需要一套自定义异常处理机制,可以创需要,或者开发团队需要一套自定义异常处理机制,可以创建自定义的异常类。建自定义的异常类。7
7、.1.6 finally7.1.6 finally语句块语句块 不论是否捕捉到异常,不论是否捕捉到异常,finally块中的代码一定会执行。块中的代码一定会执行。举个例子,在处理文件时,如果打开了一个文件,执行一举个例子,在处理文件时,如果打开了一个文件,执行一些写入操作,这时发生了致命错误,由于些写入操作,这时发生了致命错误,由于catch块捕捉到块捕捉到异常后,控制权会直接跳转到异常处理结尾,那么,这时异常后,控制权会直接跳转到异常处理结尾,那么,这时这个打开的文件便一直没有被关闭。显然这会造成资源占这个打开的文件便一直没有被关闭。显然这会造成资源占用,如果文件是以独占的方式被打开的话,其
8、他操作将无用,如果文件是以独占的方式被打开的话,其他操作将无法顺利进行。法顺利进行。7.2 7.2 记录异常记录异常 Web应用程序的用户可能成千上万,有些时候除了应用程序的用户可能成千上万,有些时候除了向用户显示错误信息之外可能还需要将异常记录下来,比向用户显示错误信息之外可能还需要将异常记录下来,比如如Web服务器负载过重,一些问题间歇性的多次出现等服务器负载过重,一些问题间歇性的多次出现等等。等。.NET框架提供了多种日记志工具,比如可以在错误产框架提供了多种日记志工具,比如可以在错误产生时发送生时发送E-Mail,添加到数据库记录或者是读写文件。一,添加到数据库记录或者是读写文件。一个
9、较好的处理方式是使用个较好的处理方式是使用Windows事件,事件,Windows事件事件程序是程序是Windows内置的用于记录系统或者是应用程序日内置的用于记录系统或者是应用程序日志的一个工具。这个工具可以被任何应用程序使用。志的一个工具。这个工具可以被任何应用程序使用。7.2.1 7.2.1 查看查看WindowsWindows事件日志事件日志 启动启动Windows事件查看器,单击事件查看器,单击“开始开始|设置设置|控制面控制面板板|管理工具管理工具”菜单,选择事件查看器,将弹出事件查看菜单,选择事件查看器,将弹出事件查看器窗口。器窗口。7.2.2 7.2.2 写入事件日志写入事件日
10、志 System.Diagnostics命名空间下提供了可以读写事命名空间下提供了可以读写事件日志的类,开发人员可以使用这个命名空间中的类将件日志的类,开发人员可以使用这个命名空间中的类将ASP.NET异常信息写入事件日志中。异常信息写入事件日志中。7.2.3 7.2.3 自定义日志自定义日志 自定义的日志是指属于自己的分类的日志,比如可自定义的日志是指属于自己的分类的日志,比如可以创建一个属于本程序特有的错误分类。以创建一个属于本程序特有的错误分类。7.2.4 7.2.4 编程查看事件日志编程查看事件日志 可以使用可以使用ASP.NET将事件日志呈现在将事件日志呈现在Web页上,这页上,这样
11、系统维护人员不用必须跑到样系统维护人员不用必须跑到Web服务上去检查应用程服务上去检查应用程序产生的日志。序产生的日志。7.3 7.3 错误页面错误页面 错误页面用于描述当前页面中未被处理的错误,当错误页面用于描述当前页面中未被处理的错误,当在进行在进行ASP.NET项目开发时,开发人员将面对大量的错项目开发时,开发人员将面对大量的错误页面来进行调试和处理。错误页面对于在开发过程中诊误页面来进行调试和处理。错误页面对于在开发过程中诊断错误是非常有用的,因为其中包含了大量关于产生错误断错误是非常有用的,因为其中包含了大量关于产生错误的信息。的信息。7.3.1 7.3.1 错误模式错误模式 笔者在
12、本地机器上产生错误的错误页面,对远程用笔者在本地机器上产生错误的错误页面,对远程用户来说,则有不同。出于安全性考虑,通常不希望在远端户来说,则有不同。出于安全性考虑,通常不希望在远端的用户看到错误页面源代码列表等。的用户看到错误页面源代码列表等。ASP.NET中,可以中,可以在在web.config配置文件中的配置文件中的配置节中配配置节中配置错误页面的显示方式。置错误页面的显示方式。7.3.2 7.3.2 自定义错误页面自定义错误页面 在在7.3.1节中列出的由节中列出的由VS2010生成的生成的节的代码中,还具有两个非常有用的节的代码中,还具有两个非常有用的子节点。该节点指定当发生指定的错
13、误时,将页子节点。该节点指定当发生指定的错误时,将页面重定向到一个定义好的错误页面。比如当发生面重定向到一个定义好的错误页面。比如当发生403错误错误时,将页面重定向到时,将页面重定向到NoAccess.htm页面。页面。7.4 7.4 页面追踪页面追踪 尽管尽管ASP.NET的错误页面提供了非常有用的信息,的错误页面提供了非常有用的信息,但是有时候开发人员需要更详细的信息来修正应用程序中但是有时候开发人员需要更详细的信息来修正应用程序中的错误。比如应用程序执行一个属性或者是追踪应用程序的错误。比如应用程序执行一个属性或者是追踪应用程序中的逻辑错误。有时候应用程序可能生成了一些无效的数中的逻辑
14、错误。有时候应用程序可能生成了一些无效的数据,但是并没有明显的异常触发。据,但是并没有明显的异常触发。ASP.NET提供了追踪提供了追踪功能,让开发人员使用一种更方便和有弹性的方式来报告功能,让开发人员使用一种更方便和有弹性的方式来报告诊断信息。诊断信息。7.4.1 7.4.1 启用页面追踪启用页面追踪 为了使用追踪功能,开发人员需要显示的允许页面追踪,为了使用追踪功能,开发人员需要显示的允许页面追踪,有几种方法可以启用追踪功能,最常用的方法是在有几种方法可以启用追踪功能,最常用的方法是在ASP.NET的页面声明区添加一个的页面声明区添加一个Trace=“true”的属性。的属性。7.4.2
15、7.4.2 页面追踪信息页面追踪信息 ASP.NET的追踪提供了大量的诊断信息,下面依次的追踪提供了大量的诊断信息,下面依次进行详细的理解:进行详细的理解:1请求详细信息请求详细信息2跟踪信息跟踪信息3控件树控件树4会话状态和应用程序状态会话状态和应用程序状态5请求请求Cookie集合和响应集合和响应Cookie集合集合6标头集合标头集合7窗体集合窗体集合8Querystring 集合集合9服务器变量服务器变量7.4.3 7.4.3 写入页面追踪信息写入页面追踪信息 默认的追踪日志提供了大量重要的信息允许开发人默认的追踪日志提供了大量重要的信息允许开发人员监视应用程序,有时可能想写入自定义的追
16、踪消息。有员监视应用程序,有时可能想写入自定义的追踪消息。有时开发人员可能想在程序的不同执行点记录变量的多个值,时开发人员可能想在程序的不同执行点记录变量的多个值,或者是代码到达某个执行点时输出一些消息以便于检查执或者是代码到达某个执行点时输出一些消息以便于检查执行过程。通常开发人员使用行过程。通常开发人员使用VS的调试器来完成类似的功的调试器来完成类似的功能,但是使用追踪也可以完成类似的功能,特别是对于一能,但是使用追踪也可以完成类似的功能,特别是对于一些由于些由于Web应用程序己经部署的场合,使用追踪是非常应用程序己经部署的场合,使用追踪是非常有意义的。有意义的。7.4.4 7.4.4 应
17、用程序页面追踪信息应用程序页面追踪信息 使用应用程序级追踪,可以让开发人员追踪整个应使用应用程序级追踪,可以让开发人员追踪整个应用程序,但是追踪信息并不显示在页面,而是被收集和保用程序,但是追踪信息并不显示在页面,而是被收集和保存在内存中一小段时间。可以通过请求一个特定的存在内存中一小段时间。可以通过请求一个特定的URL来查看最近的追踪信息。使用应用程序级追踪有几个好处,来查看最近的追踪信息。使用应用程序级追踪有几个好处,首先追踪信息将不会被格式化或者是布局首先追踪信息将不会被格式化或者是布局Web页面而搅页面而搅乱,其次是比较来自不同请求的追踪信息。乱,其次是比较来自不同请求的追踪信息。7.
18、5 7.5 小结小结 本章介绍了在本章介绍了在ASP.NET中如何进行异常处理和日志中如何进行异常处理和日志追踪。首先讨论了异常处理的基础,详细介绍了追踪。首先讨论了异常处理的基础,详细介绍了Exception类,如何在类,如何在ASP.NET应用程序中捕捉未处理应用程序中捕捉未处理的异常,如何进行异常的嵌套,以及如何自定义异常。的异常,如何进行异常的嵌套,以及如何自定义异常。接下来讨论了如何在应用程序日志中记录异常,讨接下来讨论了如何在应用程序日志中记录异常,讨论了论了Windows事件日志查看器的使用,如何向事件日志事件日志查看器的使用,如何向事件日志中写入日志项,如何自定义事件日志,并讨
19、论了以编程的中写入日志项,如何自定义事件日志,并讨论了以编程的方式查看事件日志。方式查看事件日志。本章也讨论了当应用程序出现错误时,如何为将错本章也讨论了当应用程序出现错误时,如何为将错误重定向到一个用户友好的错误页面。本章最后介绍了页误重定向到一个用户友好的错误页面。本章最后介绍了页面追踪技术,可以使用页面级的追踪和应用程序级的追踪。面追踪技术,可以使用页面级的追踪和应用程序级的追踪。7.6 7.6 常见面试题分析常见面试题分析 7.6.1 7.6.1 如何针对不同的异常进行捕捉如何针对不同的异常进行捕捉 C#中一个中一个try块可以有多个块可以有多个catch块,每个块,每个catch块块
20、可以针对特别的异常进行特别的处理。但是安全起见,最可以针对特别的异常进行特别的处理。但是安全起见,最后应该添加对后应该添加对Exception类型的异常进行捕捉的类型的异常进行捕捉的catch块,块,以保证没有异常被毫无处理地抛出。以保证没有异常被毫无处理地抛出。7.6.2 Finally7.6.2 Finally语句有什么作用?语句有什么作用?使用使用finally块可以清除块可以清除try中分配的任何资源,以及运中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码。代码控制权最行任何即使在发生异常时也必须执行的代码。代码控制权最终总是传递给终总是传递给finally块,与块,与try块的退出方式无关。因此,块的退出方式无关。因此,finally块提供了一种保证资源清理或者资源恢复的机制。块提供了一种保证资源清理或者资源恢复的机制。