您的位置:首页 > 编程语言 > ASP

[Thinking More]ASP.NET应用程序异常处理 - 第1部分

2008-06-17 00:01 260 查看
本文为RickTsuei原创,地址为http://www.cnblogs.com/RickTsuei/archive/2008/06/16/1223414.html, 转载请注明。

加入软件开发行列已经两年,我经历了从新人到被大家承认,最后成为大家信任的人。期间不仅仅是克服了技术上的难题,也让我在对人生和工作的理解上,受益匪浅。今年的计划是要做一个向技术研究迈进的转型,从基础做起,成为专家。在人事方面,我承认《顿感力》确实是在目前竞争激烈、节奏飞快、关系复杂的现代社会解决人的关系上最好的武器,但是在从研究的角度看,对于技术我们不但不能insensitive而应该Thinking more。所以我打算通过Thinking More这样的一个专题,将我在ASP.NET和其它技术方面的成长展现给大家,也希望获得大家的批评和指正。

异常处理,是开发人员比较在意的问题,从现实考虑,它可以为程序中错误的跟踪和调试带来方便;从长远考虑,在维护期好的异常处理机制,也将直接影响维护人员对临时错误的解决速度,这关系到客户对我们的信赖程度。所以我们在需求分析开始之前,就应该先了解我们的开发平台制订良好的一场处理策略。今天,我们主要讨论ASP.NET应用程序下异常的处理方式,以及影响到的设计层面。

我们先来考虑下面的问题:
1.什么是异常?
2.为什么发生异常?
3.异常在什么时候发生?
4.如何发现和处理异常?

问题1-3看起来似乎有些简单,有人会回答异常就是应用程序出现的错误,出错就会发生异常,异常在出错的时候发生。听起来似乎是缠在一起的耳机,两个头,其实是联系在一起的。实际上第一个回答是正确的,异常确实是应用程序出现的错误;第二个就有些偏离了原点,异常可能是系统抛出的,也有可能是开发人员手动抛出的。系统抛出的异常是我们必须处理掉的,如果不正确进行处理,轻则导致系统不能正确运行,重则导致系统不能使用。而开发人员手动抛出的异常可能是因为系统用户进行了错误的操作,针对这样的用户操作错误作出的一种相应,相应的目的是要提醒用户进行操作,所以这种异常一般都被转化成了页面表示的警告或提示信息,而并不是要破坏系统正常运转的行为。异常在什么时候发生,答案是任何地方,只要你有throw,任何地方都可以抛出异常,说起来似乎有些牵强,这是从侧面告知大家要提前考虑各种情况。比如说,系统启动的时候,在应用程序全局(Global)类中出现了异常,我们没有界面,是否需要表示?是否需要写日志?表示的话是否可以与系统页面内发生的异常使用同一个接口,或者写日志的时候也可以如此?!如果不在前期努力,这些问题将成为系统的羁绊,让系统开发无法顺利进行下去。

前三个问题是启发我们,要以更长远的角度去思考异常的处理机制,而第四个问题正是引导我们展开这样的实践。如何发现异常?
1) 通过使用Try ... Catch 块,我们可以捕捉块内的异常,为了节省系统资源,这些Try ... Catch块就应该被粗粒度的分布。Web页面的方法如下,事件和私有方法,私有方法一般都是在事件中被调用,那么我们在事件中部署Try ... Catch。
2)如果是页面的保护成员或私有成员出现错误呢?在.aspx中如果HTML中注册的类名不对就会出现白画面的现象,这是异常没有正常被捕捉的情况。页面级别,有一个Error方法,可以对页面中未处理的异常进行异常处理的编码。以下为System.Web.UI.Page的Error事件的处理方法。

1 Private Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Error
2 Dim ex As Exception = Server.GetLastError
3
4 ' exception handle method
5 If ex IsNot Nothing Then
6 WriteApplicationLog(ex, _entity)
7 End If
8 End Sub

Server.GetLastError方法就是取得上一个未被处理的异常。应用程序级别,也可能发生这种情况:页面的异常处理,但是应用程序级别的异常存在未处理的情况,比如HTTP请求错误。我们同样也可以在全局(Global)类的Application_Error方法中书写应用程序中未处理的异常。

1 Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
2 ' Fires when an error occurs
3 Dim ex As Exception = Server.GetLastError
4
5 UICBase.WriteApplicationLog(ex, Nothing)
6 End Sub

那么,我们捕捉到了异常,是不是直接输出异常信息就可以了呢?答案是否定的,如果一个电路板出现错误,工人需要查出哪条电路出问题和哪些电路受影响。所以对于异常的发现,我们需要定位异常并了解到异常发生时用户的访问路径。那么我们先来了解一下异常类本身可以为我们带来什么。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: