• .NET 异常


    .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会终止进程

    以至于需要终止这个进程,你可以调用EnvironmentFailFast方法。这个方法中可以指定异常消息,调用这个方法时,不会运行任何活动的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不会重新设置异常的起始点 将继续抛出异常

    区别与联系

    学习技术不只是为养家糊口,也为夜深人静的时候能够一个人静静享受这其中的乐趣。
  • 相关阅读:
    ASCII码对照表
    有种美叫做放弃
    OCX和DLL的区别
    江湖经验:喝酒的学问技巧
    TC2.0实现多文件编译
    希尔排序
    CalcOpticalFlowPyrLK的使用(转)
    简单选择排序的实现
    VS2008中解决方案窗口的问题
    用友T3用友通行政单位没有损益类科目,如何做期间损益结转?
  • 原文地址:https://www.cnblogs.com/renxs/p/2647868.html
Copyright © 2020-2023  润新知