.Net Framework异常处理机制是用Windows提供的结构化异常处理(Structured Exception Handling,SHE)机制构建的。
异常处理的好处:
1.利用异常处理,我们可以将资源清理代码放在一个固定的位置,并且确保它们得到行。
2.利用异常处理,我们可以将处理异常的代码放在一个集中的位置。
3.利用异常处理,我们可以很容易定位和修复代码中的bug。
当一个异常被抛出时,CLR会向上遍历整个堆栈,查看每个catch块的捕获筛选器-既catcha关键字后指定的异常类型
在catch块的末尾,我们有三种选择:
(1)重新抛出所捕获的异常,向更高一层的调用堆栈中的代码通知该异常的发生。
(2)抛出一个不同的异常,向更高一层的调用堆栈中的代码提供更多的异常信息。
(3)让线程从catch块的底部退出
异常堆栈踪迹
异常的踪迹指出了异常经过的路径中所发生的事件,他对于我们检测异常原因,进而修改错误代码来说非常有用。
定义自己的异常类
Exception基类型定义了三个公有构造器:
(1)一个无参(默认)的构造器,它创建一个异常类型的实例,并将所有的字段和属性设为默认值
(2)一个参数为String的构造器,它创建一个异常类型的实例,并将异常的消息文本设置为指定的字符串
(3)一个参数为String和Exception的构造器,它创建一个异常类型的实例,并将异常的消息文本和内部异常分别设为构造器参数中指定的String和Exception。
当定义自己的异常类型时,我们应该为其实现上述这三个构造器,并调用基类型中相应的构造器。
所有的异常类型都应该是可序列化的,因为只有这样异常对象才能在跨越应用程序域(AppDomain)或机器边界时到达封装处理、并在客户端重新抛出。
类库开发人员不应该为未处理异常设置任何策略。应用程序开发人员应该对定义和实现这种策略拥有完全的控制。
一种解决未处理异常的策略:当客户端请求一个远程对象或者远程服务时,服务器端的一个线程将被唤醒以处理该请求。服务器代码应该被放在一个try块中执行,该try块要有一个关联的catch块来捕获所有异常。如果cathc块捕获到一个异常,那么该异常有关的信息将被作为服务器的相应发给客户端。当客户端代码检测到右异常从服务器返回时,他将对异常对象执行反序列化,然后将其抛出,这将使得客户端代码能够捕获服务器抛出的异常。
在考虑未处理异常时,我们应该清楚我们正在处理的为何种线程。
如果异常未得到处理,CLR会终止进程
以至于需要终止这个进程,你可以调用Environment的FailFast方法。这个方法中可以指定异常消息,调用这个方法时,不会运行任何活动的try/finally块或者Finalize方法。然后它会将消息发送个Windows Application的日志。
●使用lock语句,锁会在finally块中释放。
●使用using语句,会在finally块中调用对象的Dispose方法。
●使用foreach语句,会在finally块中调用IEnumerator对象的Dispose方法。
●定义析构方法时,会在finally块调用基类的Finalize方法。
主线程 执行控制台应用程序(CUI)、或Windows窗体应用程序(GUI)的Main方法的那个线程为一个托管主线程
手工线程 应用程序代码使用System.Threading.Thread对象显示创建的线程成为手工线程
线程池线程 .NET框架中的许多特性多利用了内建于CLR中的线程池。
终止化线程 在垃圾收集器判定对象为不可达时,托管堆有一个线程专门执行对象的Finalize方法
非托管线程 一些线程创建时无需知道任何CLR的知识
throw ex throw e; //CLR认为这里是异常的起始点 重新设置异常发生点..不会记录发生异常的代码行
throw new exception() //抛出自定义异常 和throw ex一样
throw: //CLR不会重新设置异常的起始点 将继续抛出异常
区别与联系