• 十、C# 异常处理


    1、多异常类型
    2、捕捉异常
    3、常规catch块
    4、异常处理的指导原则
    5、定义自定义异常
     
    1、多异常类型
    代码要引发任何异常,只需为要引发的异常实例实例附加关键字throw作为前缀。具体选择的异常类型
    应该能够最好地说明异常发生的背景。
     
     
    2、捕获异常
    通过引发一具特定的异常类型,可以让类型本身来识别问题。
    C#允许使用多个catch块,每个块都面向一个特定的异常类型。
     1           try
     2             {
     3                 TemporaryFileStream fileStream = new TemporaryFileStream();
     4                 //Use temporary file stream;
     5  
     6                 //..
     7  
     8                 fileStream.Dispose();
     9  
    10                 //..
    11             }
    12             catch (NullReferenceException e)
    13             {
    14  
    15             }
    16             catch (ArgumentException e)
    17             {
    18             }
    19             catch (InvalidCastException e)
    20             {
    21             }
    22             catch (SystemException e)
    23             {
    24             }
    25             catch (Exception e)
    26             {
    27             }
    每个块都处理一个不同的异常类型。
    一个异常发生的时候,会跳转到与异常类型最匹配的catch块执行(从上往下匹配是否符合)
    匹配度是由继承来决定的。例如,即使引发的是System.Exception类型的异常,由于System.ApplicationException派生自
    System.Exception,因此System.ApplicationException与引发的异常匹配度最高。
    最终将由 catch (ApplicationException e)块处理。
    catch块必须按照从具体到最常规的顺序排列,以避免编译错误。
    注:catch块并非一事实上需要一个命名的参数。事实上,最后一个catch块,甚至连类型参数都可以不要。
     
    空catch块的内部原理
    与一个空catch块相对应的CIL代码是一个catch(object)块。这意味着不管引发什么类型,空catch块都能捕捉到它。
     
    异常处理的指导原则
    。。。。待学习
     
    3、定义自定义异常
    定义一个自定义异常时,从System.Exception或者其他异常类型派生就可以了。
     
    可以参照公司的
    自定义异常唯一的硬性要求就是它必须从System.Exception或者某个子类派生。除此之外,在使用自定义异常的时候,还就遵照
    以下最佳实践
    所有异常都应该使用"Exception"后缀,彰显其用途。
    通常,所有异常都应该包含以下3个构造器:无参数构造器,获取一个string参数的构造器以及同时获取一个字符串
    和一个内部异常作为参数的构造器。
    避免使用深的继承层次结构(一般应该小于5级)
    重新引发一个异常时,假如重新引发的异常与捕捉到的异常不同,内部异常就会发挥重要的作用。可以将异常保存到
    InnerException属性中。
     
     
     
    4、可序列化异常
    可序列化对象:是“运行时”可以持久化成一个流(如一个文件流),然后忱个流来重新实例化的对象。
    在异常的情况下,一些分布通信技术可能需要它。
    为了支持序列化,异常声明就包含System.SerializableAttribute这个特性,或者应该实现 
    Iserializable。
    除此之外,它们必须包含一个构造器来获取System.Runtime.Serialization.SerializationInfo和
    System.Runtime.Serialization.StreamingContext作为参数。
     
    定义一个可序列化异常
     1     //支持可序列化异常
     2     [Serializable]
     3     class DataBaseException : System.Exception
     4     {
     5        public DataBaseException(System.Runtime.Serialization.SerializationInfo serializationInfo,
     6            System.Runtime.Serialization.StreamingContext context)
     7        {
     8  
     9        }
    10        
    11     }
    5、checked与unchecked
    在checked块内,如果在运行时发生一次溢出的赋值,就会引发一个异常。
    在unchecked块内,它会将数据截断,而不是为块中的赋值引发异常
    1           checked
    2             {
    3                 int n = int.MaxValue;
    4                 n = n + 1;
    5                 Console.WriteLine(n);
    6             }    
    运行时,提示  n = n + 1;
    算术运算导致溢出
    1               unchecked
    2             {
    3                 int n = int.MaxValue;
    4                 n = n + 1;
    5                 Console.WriteLine(n);
    6                 Console.Read();
    7             }
    输出:
    -2147483648
     
    在不允许使用语句的时候(比如在初始化时候,还可使用checked和unchecked表达式)
    1 int n = unchecked(int.MaxValue + 1);
     
     
  • 相关阅读:
    Build 2019 彩蛋
    崂山
    Win10 iot 修改日期时间
    《 结网:改变世界的互联网产品经理 》
    <[你在荒废时间的时候别人都在拼命!]>
    《时间的玫瑰》阅读笔记
    翻石头价值投资手册-科技行业
    No module named flask.ext.sqlalchemy.SQLALchemy
    《寻找伟大的企业》
    <《基金经理投资笔记丛书4-1:投资是一种生活方式》>
  • 原文地址:https://www.cnblogs.com/tlxxm/p/4604542.html
Copyright © 2020-2023  润新知