深层次详解Exception

所有的异常类都继承自System.Exception类,当异常产生时,CLR将创建该异常类的实例对象,将从最底层依次寻找合适的异常类型,同时若存在catch语句时将会选择最合适的语句进行处理。

catch语句包括三种形式:

 若使用第三种类型,可以得到异常实例 InstanceID的相关属性,如Message、Source等。

多catch的处理原则

一个异常发生时,会跳转到与异常异常最匹配的catch块执行,继承链决定了匹配度。

public static void HandleExecptionMethod()
        {
            try
            {
                throw new ApplicationException("ApplicationException Occur!");
            }
            catch (NullReferenceException)//尝试取消引用空对象时引发
            {
                Console.WriteLine("Handle1");
            }
            catch (ArgumentException)//当向方法提供的参数之一无效时引发
            {
                Console.WriteLine("Handle2");
            }
            catch (ApplicationException)//当程序发生非致命性应用程序错误时引发的异常
            {
                Console.WriteLine("Handle3");
            }
            catch (SystemException)
            {
                Console.WriteLine("Handle4");//与system命令空间中预定义异常定义基类
            }
            catch (Exception)//应用程序执行过程中发生错误
            {
                Console.WriteLine("Handle5");
            }
            Console.ReadKey();
        }

在上例中共有5个catch块,注意catch块必须按照从最具体到最常规的顺序排列,否则可能造成编译错误。例若将Handle5的向上移到Handle4前面,则发生编译错误。

 public static void ThrowDemoMethod()
        {
            FileStream fs = null;
            try
            {
                fs = new FileStream("c:\dd.txt",FileMode.Open);
                StreamReader strder = new StreamReader(fs,System.Text.Encoding.Default,false);
                string st = strder.ReadLine();
                Console.WriteLine(st);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.GetType());//获取异常类型
                //throw new FileNotFoundException("data.txt is not existed");  //重新获取异常
            }
            finally
            {
                fs.Close();
            }
        }
 FileStream 下的引发的异常
 
附:异常层次图
原文地址:https://www.cnblogs.com/xtt321/p/3226702.html