文档介绍:第 7 章异常处理和日志追踪
第 7 章异常处理和日志追踪
在应用程序运行过程中,难免会遇到异常、错误。在开发过程中经常会被一些用户投拆软件出现
故障,或者是一些乱七八糟的错误提示。用户并不都是专家,看到这些莫名其妙的错误往往会认为是
应用程序不稳定因素所致,此时你会振振有词地告知用户:软件出现故障是难免的,微软够强大吧,
Windows系统还不是会蓝屏出错。这样的解释并不是没有道理,任何软件都不可能十全十美,问题在于
开发人员如何处理错误,如何让应用程序能够无缝地从错误中恢复。
应用程序中的异常,如何追踪错误以及解决一些故障问题,讨论结
构化异常处理,日志记录以及当出现错误时,如何将用户页面重定向到一个用户友好的提示页面,本
页面的诊断信息。
应用程序异常处理
错误的产生很多时候是开发人员始料未及的,有的错误可能运行了很久才突然被触发。然而也有
一些错误是由于开发人员的疏漏所造成的,一个简单的例子是被0除。假如在一个具有很多复杂公式的
页面上,要求用户输入有效的数据执行计算,由于
没有很好的验证机制,用户如果一不小心输入了一
个0作为被除数,将跳转到一个错误页面,
。
当引发错误时,.NET将检查当前页面范围内是
否有任何错误处理器。假如错误产生于一个方法体
内,.NET将检查方法体内是否有一个错误处理器来
处理错误,如果没有任何的错误处理机制,页面处
理将被中断,一个错误页面将被显示出来。这个显
示的错误页面依赖于客户端的位置,如果是本地则
显示详细的错误信息,否则只显示一个通用的消息。
被0除错误
会先检测本地的错误处理器,因此开
发人员可以设计良好的错误处理方式,比如显示一个友好的信息,或者是不显示错误信息而将这些错
误记录到事件日志中,应用程序中的错误。
异常处理基础
语言都支持结构化异常处理,当一个错误引发时,.NET框架其实创建了一个异常对象
用于呈现问题。开发人员可以使用异常处理器来捕捉这个异常对象。假如不使用异常处理器的话,用
户代码将会被中止,将显示一个让用户迷惑的错误处理页面。
为了演示如何使用结构化的异常处理,mError。在
,为该Button添加一个单击事件,代码如下所示。
书山有路勤为径学海无涯苦作舟
145
protected void Button1_Click(object sender, EventArgs e)
{
int x = 5;
int y = 0;
//故意被0除, 产生一个异常
int z = x / y;
}
由于这段代码中没有添加任何的异常处理器,将中断页面的显示,并显示一个如图
。如果使用结构化的异常处理方式,代码将变成这样所示。
protected void Button1_Click(object sender, EventArgs e)
{
int x = 5;
int y = 0;
try
{
//故意被0除, 产生一个异常
int z = x / y;
}
catch (DivideByZeroException ex)
{
= "产生了一个异常, 由异常处理器返回的信息是:" + ;
}
}
在这段代码中,使用try/catch语句定义了一个异常处理器,该异常处理器捕捉一个被0除的异常
DivideByZeroException,当捕捉到这个异常后将会在一个Label控件中显示出错的信息,运行效果如图
。
异常处理器运行效果
在这个示例中,当产生异常时,将不再被重定向到一个单独的页面,而是在Label控件中
显示出错的信息。示例使用了try/catch语法来捕捉异常,中标准的异常处理方法,在try块中
放置所有可能出现异常的代码,在catch块中捕捉可能出现的异常,并在其代码块中添加对该异常的处
理程序。
Exception类
上一节的示例中,当产生了被零除的错误后,.NET会创建一个名为DivideByZeroException的异常
对象,catch块中将捕获这个异常对象,并执行处理异常的代码块。DivideByZeroException是一个派生
自Exception的对象。Exception对象中包含了很多有用的关于异常的信息,如上面示例中的Message属
性用于获取异常的描述性信息,