Argo


  我的地盘Ajax做主
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

统一的异常捕获机制

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

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