zoukankan      html  css  js  c++  java
  • 异常处理机制

    目录

    • 异常的结构以及执行顺序
    • System.Exception异常类

    一、异常的结构以及执行顺序

    先上一段代码:a是多少?

     int a = 0;
                try
                {
                    a++;
                    throw new Exception();
                   
                }
                catch (Exception ex)
                {
                    try
                    {
                        a++;
                        return;
                    }
                    finally
                    {
                        a++;
                    }
                }
                finally
                {
                    a++;
                }

     先说一下三个块的运行关系(try、catch、finally)。

    try块:尽可能地将比较容易出现异常的代码放在try块中,而且一个try块至少与一个catch块或者finally块匹配。try块中还是可能包含子try{}catch{}块。

    catch块:1、是对抓取到的异常的一个响应,try块有可能关联0个或者多个catch块。 没有抓取到异常,跳过catch块,执行finally块(有的话)。可以抓取到异常,执行catch块中的代码。

          2、捕捉到的类型必须为System.Exception类型或者派生类型。抛出异常,会自上而下进行匹配,所以将范围较小的异常类型放在上面。

           如果没有匹配到异常类型,就会抛出一个为处理的一场类型。如果匹配到了异常类型,就执行内层所有的的finally块,catch块中的代码执行完毕后,再执行与这个catch块匹配的finally块。          

          

    finally块:肯定会执行,比如释放资源等操作。避免在finally中再次抛出异常。

    二、System.Exception类

     // 摘要: 
            //     获取一个提供用户定义的其他异常信息的键/值对的集合。
            //
            // 返回结果: 
            //     一个对象,它实现 System.Collections.IDictionary 接口并包含用户定义的键/值对的集合。 默认值为空集合。
            public virtual IDictionary Data { get; }
            //
            // 摘要: 
            //     获取或设置指向此异常所关联帮助文件的链接。
            //
            // 返回结果: 
            //     统一资源名称 (URN) 或统一资源定位器 (URL)。
            public virtual string HelpLink { get; set; }
            //
            // 摘要: 
            //     获取或设置 HRESULT(一个分配给特定异常的编码数字值)。
            //
            // 返回结果: 
            //     HRESULT 值。
            public int HResult { get; protected set; }
            //
            // 摘要: 
            //     获取导致当前异常的 System.Exception 实例。
            //
            // 返回结果: 
            //     一个 Exception 的实例,描述导致当前异常的错误。 InnerException 属性返回与传递给构造函数的值相同的值,或者,如果没有向构造函数提供内部异常值,则返回
            //     null 引用(Visual Basic 中为 Nothing)。 此属性为只读。
            public Exception InnerException { get; }
            //
            // 摘要: 
            //     获取描述当前异常的消息。
            //
            // 返回结果: 
            //     解释异常原因的错误消息或空字符串 ("")。
            public virtual string Message { get; }
            //
            // 摘要: 
            //     获取或设置导致错误的应用程序或对象的名称。
            //
            // 返回结果: 
            //     导致错误的应用程序或对象的名称。
            //
            // 异常: 
            //   System.ArgumentException:
            //     该对象必须为运行时 System.Reflection 对象
            public virtual string Source { get; set; }
            //
            // 摘要: 
            //     获取调用堆栈上直接帧的字符串表示形式。
            //
            // 返回结果: 
            //     用于描述调用堆栈的直接帧的字符串。
            public virtual string StackTrace { get; }
            //
            // 摘要: 
            //     获取引发当前异常的方法。
            //
            // 返回结果: 
            //     引发当前异常的 System.Reflection.MethodBase。
            public MethodBase TargetSite { get; }
    View Code

    StackTrace:catch块可以读取这个属性获取堆栈跟踪,可以获取异常抛出前调用的方法。如果我们构造一个新的Exception类,StackTrace属性重置为null。访问该属性实际是执行了CLR代码。 

    如果一个异常抛出,CLR记录异常抛出的位置,catch块捕捉到异常,CLR会记录捕捉到异常的位置。我们在catch块内访问异常对象的StackTrace属性,实际还是会调用CLR代码,生成一个字符串,里面包含从异常位置到捕捉位置调用的所有方法。

    后续。。。

  • 相关阅读:
    C++ 如何判断所调用的重载函数
    C++ 入门5 类和动态内存分配(一)
    c#动态创建ODBC数据源
    设为首页,加入收藏,联系我们
    ASP.NET 2.0中CSS失效
    typedef的四个用途和两个陷阱(转)
    VC++实现应用程序对插件的支持(转)
    DOM无关事件
    How to Migrate from WCF Web API to ASP.NET Web API
    Using ASP.NET Web API with ASP.NET Web Forms
  • 原文地址:https://www.cnblogs.com/sunchong/p/4466148.html
Copyright © 2011-2022 走看看