Argo


  我的地盘Ajax做主
posts - 6, comments - 37, trackbacks - 0, articles - 2
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

统一的异常捕获机制

Posted on 2009-07-17 17:52 Argo 阅读(2230) 评论(10) 编辑 收藏

      你能保证你写的程序所有异常都能捕获到嘛?程序逻辑越复杂,越有可能有些异常没有考虑到,程序遇到这些情况基本上就是异常退出,所以一个能捕获到所有异常的需求就来了,我个人认为有异常不见得都是坏事,至少我的程序中都有异常捕获记录日志的功能,通过这个日志能完善自己的程序,或者说能发现程序中的BUG。

我把程序分为三类Web Application/Windows Application/Console Application,下面就一一说说如何捕获异常

1、Web Application

利用HttpApplication.Error事件获得所有程序中未捕获的异常

2、Windows Application

AppDomain.CurrentDomain.UnhandledException

Application.ThreadException

利用这两个事件获得所有程序中未捕获的异常

3、Console Application

利用AppDomain.CurrentDomain.UnhandledException事件获得所有程序中未捕获的异常

 

附件是我自己写的一个统一的异常捕获机制

用法如下:

1、Web Application

配置web.config文件即可

1<httpModules>
2    <add name="ExceptionManagement" type="Longbow.ExceptionManagement.ExceptionManagementModule, Longbow.ExceptionManagement"/>
3</httpModules>

 

使用时只需要调用静态方法Publish即可如下:

 1try
 2{
 3    // 
 4}

 5catch (ArgumentNullException ex)
 6{
 7    Longbow.ExceptionManagement.ExceptionManager.Publish(ex);
 8}
 
 9
10

2、Console Application/Windows Application

在程序入口处加入下面代码即可

1// Console Application
2ExceptionManager.RegisterExceptionHandler(null);
3// Windows Application
4ExceptionManager.RegisterExceptionHandler(typeof(Application)); 

功能介绍:

提供五种错误日志记录方式

1、记录到系统日志中可以自定义logName

config文件配置如下:

 

1 <configSections>
2     <section name="exceptionManagement" type="Longbow.ExceptionManagement.Configuration.ExceptionManagerSectionHandler, Longbow.ExceptionManagement" />
3 </configSections> 
4 
5 <exceptionManagement mode="On">
6   <publisher name="default" exceptionFormat="Exception" applicationName="UnHandlerException" logName="Application" />
7 </exceptionManagement>

2、记录到文件中

config文件配置如下:

1 <exceptionManagement mode="On">
2   <publisher name="default" exceptionFormat="File" fileName="~/Log/Error.log"/>
3 </exceptionManagement> 

fileName可以为空,默认文件路径为<程序路径\App_Data\EventLog\Error{yyyy-MM-dd}.log>

Web Application 请使用~开头表示站根目录开始,注意要给写文件权限。

3、记录为Xml格式的文件

1 <exceptionManagement mode="On">
2   <publisher name="default" exceptionFormat="Xml" fileName="~/Log/Error.log"/>
3 </exceptionManagement>

4、记录为邮件发送到系统管理员信箱

 

 1 <system.net>
 2   <mailSettings>
 3     <smtp from="argo@163.com" deliveryMethod="Network">
 4       <network host="smtp.163.com" password="password" userName=argo@163.com port="25" defaultCredentials="false"/>
 5     </smtp>
 6   </mailSettings>
 7 </system.net>
 8 
 9 <exceptionManagement>
10   <publisher name="default" mode="On" webmaster="argo@163.com" subject="Test" exceptionFormat="Email" />
11 </exceptionManagement>

5、自定义日志记录方式,自己编写一个日志记录类即可,继承IExceptionPublisher

1 <exceptionManagement mode="On">        
2     <publisher name="default" assembly="Longbow" type="Longbow.CustomerExceptionPublisher" fileName="\ErrorLog\Error.log" />
3 </exceptionManagement>

 

下载Longbow.ExceptionManagement.dll

Feedback

#1楼  回复 引用 查看   

2009-07-17 18:20 by 老夫子系      
请问楼主:对于Web Service 或者 WCF ,怎么捕抓异常!

#2楼  回复 引用 查看   

2009-07-17 18:34 by 徐少侠      
和以前知道的优点出入
找点资料再来回复

至少web方面还有点补充的说法

#3楼  回复 引用 查看   

2009-07-17 20:54 by 不若相忘于江湖      
如果不开源的话 不太敢用,

#4楼  回复 引用 查看   

2009-07-17 22:13 by Tony Chi      
直接是用EntLib不就得了。为什么重复造轮子呢。

#5楼[楼主]  回复 引用 查看   

2009-07-17 23:36 by Argo      
@Tony Chi

看清楚哦,我这个比EntLib的功能多

#6楼[楼主]  回复 引用 查看   

2009-07-17 23:36 by Argo      
@不若相忘于江湖

等等就开源,这个组件我用3年多了。

#7楼  回复 引用 查看   

2009-07-18 09:19 by 天羽      
这个不错....
支持下,开源就更好了.

#8楼  回复 引用 查看   

2009-07-18 15:49 by Tony Chi      
@Argo

记录方式你上面列举的EntLib都支持。也可以自己进行扩展。

自动发送邮件提醒也没问题。

TerryLee的EntLib系列有详细的介绍。

http://www.cnblogs.com/Terrylee/archive/2006/08/01/464591.html

#9楼[楼主]  回复 引用 查看   

2009-07-18 18:54 by Argo      
@Tony Chi

貌似不是你说的那样吧。默认支持的就是写入到系统日志中,其余的都是要自己扩展才行。EntLib我好多年前看的呢。是第一个版本。我用起来不方便,我才自己做的这个组件

#10楼  回复 引用 查看   

2009-07-18 22:44 by Tony Chi      
@Argo

之前的我不是很清楚,我接触的3.1、4.1版本的都是可以对一个Exception指定一个Log Handler的,然后Log Handler的话可以支持各种各样的Trace Listeners的,比如系统日志,邮件提醒,数据库,文件等等。

这些东西都是可以直接进行配置,如果不满足当然都是可以自己扩展Handler了。呵呵。