赞
踩
.NET异常处理注意点
抛出异常的时机:
在设计一个函数的时候,应该使用代码尽可能的避免已知的异常,比如:空值,除零等。但是如果遇到了未知异常并且使用函数的返回值不足以表达遇到的异常的时候,应该抛出这个异常,有必要的时候应该设计自己的异常类,使用InnerException表达遇到的未知异常。
追记,由于函数都有可能抛出异常,所以,在添加函数注释的时候,应该使用<exception cref="Exception"></exception>来标记。使用函数的时候,查看注释可以看到该标记,来避免已知异常。
处理未知异常:
确保所有的程序入口都使用了try-catch。
在catch中截获所有的异常,并进行处理。对异常进行处理的方式有:
1.记录异常
在文件中记录异常
在数据库中记录异常
在Eventlog中记录异常
2.发送E-mail来通知异常
3.异常产生时候,用友好(user-friendly)的方式通知用户
捕获UI线程中的未处理异常:添加一个全局异常处理函数
我们虽然没有在所有的应用程序入口写捕获异常的try-catch块,但是使用Application对象中的ThreadException属性可以设置一个delegate来捕获所有未处理的Main UI线程中出现的异常。这种方式只能处理主线程当中的异常,其他工作线程、辅助线程在异常时捕获不到的。
捕获工作线程(Worker Threads)中的未处理异常
编写多线程代码时,必须考虑在工作线程中出现的异常。在线程的入口使用try-catch捕获工作线程中产生的未处理异常,然后,在Catch中使用delegate或其他的方式将发生的异常通知给主线程。
Private void ThreadProcessCB()
{
Try
{
…
}
Catch(exception ee)
{
This.BeginInvoke(new WorkerThreadExceptionHandlerDelegate(WorkerThreadExceptionHandler), new object[]{ee});
}
}
异常处理的最好方法
不要:
Catch异常并re-throw,因为重新抛出一个新的异常,会损失一些消息,例如会损失这个异常中带有的一些调用堆栈的信息。
通过抛出异常来控制代码的执行。
在程序的构造函数入口处添加try-catch方法/属性/构造。
MessageBox.Show(MyException.ToString())。
使用了try-catch但是并没有处理异常,这样就隐藏了该异常,不利于发现问题,可能使程序进入未知的处理分支。
需要:
从始至终要紧记异常处理的策略。
抛出具体的一个异常,而不是只抛出Exception类型的异常。这样能方面我们捕获对应类型的异常。
在应用程序所有的入口处使用try-catch:事件处理函数,主函数,线程入口。
在代码中处理所有意料到的异常。
编写代码时要注意考虑到应用程序最差的情况。
显示有好的信息,并提供适当的管理员联系信息
在可能的情况下提供可能的选择(终止,重试,忽略)
异常处理程序块
Publisher/subscriber设计模式
下载异常处理程序块
编译工程
在新的工程中添加引用
引入名称空间Microsoft.ApplicationBlock.ExceptionManagement
使用ExceptionManager.Publish()来发布异常
配置app.config文件启用异常管理,使其出现异常的时候在系统日志中添加一条记录。
在.config文件中配置一些信息可以添加自己的异常处理模块
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。