序中网站面临的挑战可以说是各类程序中比较大的了。为什么这么说呢原因很简单一个网站的用户千差万别用户习惯各不相同用户所使用的电脑和软件平台也各异网络环境更是大相径庭所以网站发生异常情况的几率也是比较大的。既然异常不可避免但我们应该为我们的网站制定一套异常处理机制即如何更合理的为已经发生的异常善后。本文的讨论仅限于.NET环境的网站开发中的异常处理其他平台的道理应该是一样的只是具体的实现方式不同而已。其实大部分异常无非分为两大类第一类是你知道可能会发生的即开发人员在写程序的时候就已经知道可能会发生的一些意外情况。这种情况的异常又可以分为如下几种情况其一异常的发生不会影响程序的正常执行只需要把这个异常正确捕获到并做相应的处理即可其二异常一旦发生程序无法完成正常的处理逻辑这个时候需要跳转异常处理逻辑上来提示或者通知管理员或者最终用户目前发生的情况。以便管理员或者用户做相应的处理以后才能正常执行程序逻辑。举个例子用户想查询数据库中的某条数据记录当程序试图连接目标数据库的时候发现数据库服务器Down机了正常的查询操作已经没有办法继续。这就要求程序在处理像连接数据库这样的操作的时候先要判断数据库是否运行正常一旦捕获到数据库运行异常应该立即记录错误日志并报告数据库管理员同时给予用户友好的提示其三有的异常是正常处理逻辑的需要。比如.NET中Thread.Abort()就会引发一个ThreadAbortException调用Response.End(), Response.Redirect(), Response.Transfer()的时候也会引发一个ThreadAbortException这些都是用于控制正常逻辑的。这类异常一般不需要你做太多额外的处理。值得注意的是我们在写自己的程序的时候尽量不要把异常当成正常处理逻辑的一部分这样会导致程序执行效率低下。举个例子inttemp0;try{tempInt32.Parse(input);}catch{temp1;//1是默认值}上面这段代码就把异常处理当成了正常处理逻辑的一部分这样会使得程序执行效率低下。上面这段代码写成如下形式会好些inttemp0;if(Int32.TryParse(input,outtemp)false){temp1;//1是默认值}现在接着上面的说除去第一类异常外还有一种异常即第二类异常是程序开发人员在一开始没有想到的一些异常情况已经超出了程序编写人员的处理范围。这类异常是很致命的一旦发生对系统将造成很大影响。因为到了这个时候程序已经的运行已经不在我们的控制范围内了。对于第一类异常程序员基本都已经将他们就地解决了。对于第二类异常就需要为其建立一个统一的处理机制。对于一个中等规模以上的网站来说业务逻辑是比较复杂的涉及的网页也很多。我们事先不知道哪个页面或者哪段程序会出异常至少在程序开发的时候没有完全想到的一些异常所以才需要有这样一套统一的异常处理机制。这里讨论两种可行的办法第一种办法是为网站所有的页面创建一个基类基类继承自System.Web.UI.Page在基类里面统一处理各类异常情况。实现方式是为基类添加一个异常处理事件即this.Error new System.EventHandler(this.PageBase_Error); 把你的异常处理逻辑实现在方法PageBase_Error中。Code上面的异常处理方法主要干了两件事情第一记录详细的出错信息包括错误描述时间发生的程序集堆栈跟踪甚至当前使用网页的用户信息IP地址等信息。同时给管理员发送邮件。第二给用户显示一个非常友好的错误提示信息让用户心里好受些。一旦完成这个基类设计以后你只要让你的其他所有页面都从这个基类继承下来就能保证整个网站都有一个统一的异常处理机制了。第二种统一处理机制的实现方式是在Global. asax里面实现。开发过.NET网站的朋友应该对他非常熟悉在里面你可以为整个站点定义各种事件的处理方法比如SessionStart ApplicationStart等等。这里我们关注的是站点级的异常处理事件Application_Error(Object sender, EventArgs e)当网站遇到异常的时候甚至是像404这样的错误都会触发这个事件。实现方式如下Code当然你可以这样来实现// 在Global中voidApplication_Error(Object sender, EventArgs e){Server.Transfer(Errors.aspx);}// 在Error.aspx中Code提示这就尽量避免Error.aspx中再抛出异常。