你能保证你写的程序所有异常都能捕获到嘛?程序逻辑越复杂,越有可能有些异常没有考虑到,程序遇到这些情况基本上就是异常退出,所以一个能捕获到所有异常的需求就来了,我个人认为有异常不见得都是坏事,至少我的程序中都有异常捕获记录日志的功能,通过这个日志能完善自己的程序,或者说能发现程序中的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文件即可
2 <add name="ExceptionManagement" type="Longbow.ExceptionManagement.ExceptionManagementModule, Longbow.ExceptionManagement"/>
3</httpModules>
使用时只需要调用静态方法Publish即可如下:
2{
3 //
4}
5catch (ArgumentNullException ex)
6{
7 Longbow.ExceptionManagement.ExceptionManager.Publish(ex);
8}
9
10
2、Console Application/Windows Application
在程序入口处加入下面代码即可
2ExceptionManager.RegisterExceptionHandler(null);
3// Windows Application
4ExceptionManager.RegisterExceptionHandler(typeof(Application));
功能介绍:
提供五种错误日志记录方式
1、记录到系统日志中可以自定义logName
config文件配置如下:
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文件配置如下:
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格式的文件
2 <publisher name="default" exceptionFormat="Xml" fileName="~/Log/Error.log"/>
3 </exceptionManagement>
4、记录为邮件发送到系统管理员信箱
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
2 <publisher name="default" assembly="Longbow" type="Longbow.CustomerExceptionPublisher" fileName="\ErrorLog\Error.log" />
3 </exceptionManagement>