C#中的异常处理机制

C#中的异常处理机制

  • 在C#中使用try catch finally语句来进行异常捕获。一般而言,在有可能会发生错误的地方,我们便需要引入这个错误处理机制,避免程序的奔溃。
  • 首先介绍try,我们需要用try块来包含将有可能会发生错误的代码,如果在try的代码块中发生错误,那么在发生错误的代码之后的try语句中的其他代码便不会再执行了,它会跳转到catch或者finally中去。
  • 接下来是catch,catch就是用来捕获代码中的错误的,一旦try块中的代码发生错误,那么catch就能捕获这种类型的错误,而所有的错误都是继承了Exception类的,所以在catch中指定参数类型为Exception的话,便能够捕获所有类型的错误。
  • 最后是finally,如果在这个程序中有无论是否发生错误,都一定需要被执行的代码,只要执行了try中的代码,那么便可以把它写在finally里面。
  • try必须与catch或者finally其中一个或者两个配对,否则就失去了try的意义了。
  • try块的嵌套使用,在异常捕获中,可以进行嵌套的使用。
        static void Main(string[] args)
        {
            try
            {
                try
                {
                    throw new Exception("发生了错误1");
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            Console.Read();
        }

我们可以在try中再次添加一个try catch语句,当发生错误时,优先触发最内层的try语句,这时,我们也可以通过catch将该错误接着延续下来。

  • 我们需要注意的是,在使用了try catch语句时,请不要在catch语句不做任何的处理,即使不知道在这一步需要进行什么处理,可以将该异常再次抛出来或者记录下来,否则当程序出现问题时,由于这里将这个异常给屏蔽掉了而对程序的分析造成一定的困难。
  • 空try+finally的使用,在查看ConcurrentQueue的源码的时候,发现了一个有意思的现象,
        internal bool TryAppend(T value)
        {
            if (m_high >= 31)
            {
                return false;
            }
            int num = 32;
            try
            {
            }
            finally
            {
                num = Interlocked.Increment(ref m_high);
                if (num <= 31)
                {
                    m_array[num] = value;
                    m_state[num].m_value = true;
                }
                if (num == 31)
                {
                    Grow();
                }
            }
            return num <= 31;
        }

并发队列的添加元素的方法中竟然有一个空的try块,既然try块中为空,那么还要它干嘛呢,其实,醉翁之意不在酒,我们需要的是finally而已,因为finally不能单独存在,所以必须要有一个try在这里,那么这个finally在这里能保证什么呢?答案就是,它能够保证该线程在执行进入finally块中时,即使线程调用abort引发了终止异常,依然能够将finally代码执行完毕。

代码演示如下:

        static void Main(string[] args)
        {
            Thread th = new Thread(new ThreadStart(Method));
            th.Start();
            Thread.Sleep(1000);
            th.Abort();
            Console.Read();
        }
        static void Method()
        {
            Console.WriteLine("线程开始执行");
            Thread.Sleep(2000);
            Console.WriteLine("线程结束执行");
        }

在这里插入图片描述

在这里可以看到,该线程在运行到1s时调用了abort终止了,输出线程结束执行的语句并没有被执行。

下面是使用了finally语句的程序

        static void Main(string[] args)
        {
            Thread th = new Thread(new ThreadStart(Method));
            th.Start();
            Thread.Sleep(1000);
            th.Abort();
            Console.Read();
        }
        static void Method()
        {
            Console.WriteLine("线程开始执行");
            try
            {
            }
            finally 
            {
                Thread.Sleep(2000);
                Console.WriteLine("线程结束执行");
            }
        }

在这里插入图片描述
同样的,也是在该线程执行1s时引发了abort异常,但是,该线程依然能够将finally语句执行完毕。

  • 所以说,当我们又需要在使用thread的情况下,保证一段代码的从开始执行到结束不会被打断而结束掉,我们可以使用finally来防止abort引发的终止线程带来的这个问题。
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页