首页 > 代码库 > 【又长见识了】C#异常处理,try、catch、finally、throw

【又长见识了】C#异常处理,try、catch、finally、throw

  

  异常处理:程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。处理这种错误,就叫做异常处理。

  1、轻描淡写Try、Catch、Finally、throw用法

  在异常处理中,首先需要对可能发生异常的语句进行异常捕捉,try就是用于预测可能出现的异常。捕获异常并对异常进行处理,就在catch中实现。不管异常发生与否,都会执行finally里面的语句。先看一个例子:  

        static void Main(string[] args)        {            Console.WriteLine("请输入除数:");            int num1 =int.Parse ( Console.ReadLine());            Console.WriteLine("请输入被除数:");            int num2 = int.Parse(Console .ReadLine ());            int res = 0;            try            {                Console.WriteLine("异常前…………………………");                res = num1 / num2;                Console.WriteLine("无异常…………………………");                Console.WriteLine("{0}除以{1}等于:{2}", num1, num2, res);            }            catch (Exception ex)            {                Console.WriteLine("出现异常了!!!!!!!!");                Console.WriteLine(ex.Message);            }            finally            {                Console.WriteLine();                Console.WriteLine("计算结束!");            }                        Console.Read();        }

  如上例所示,两个数相除,特别是用户输入的时候不可控,很可能存在除数为零的异常,把它们放在try语句中。当执行到try语句中,出现异常立即退出try语句(意味着出现了异常,异常以前的语句要执行,异常后的语句就不执行了),然后执行catch中的语句。不管异常出现与否,都要执行finally里的语句。其实最后一句不放在finally里面,还是不管异常发生与否都会执行啊,那finally有什么作用呢?先埋一个伏笔。throw则用于抛出异常,把异常返回给程序,出了异常,当然程序就会中断啦,会抛出异常。

 

  再看一个例子:try和catch中存在retrun的情况

        static int Division(int num1, int num2, out int res)        {            int times = 0;            try            {                res = num1 / num2;                return times;            }            catch (Exception ex)            {

                  res = 0;
                  return times--;

            }            finally            {                times++;            }        }
            int res;
// int times = Division(20, 0, out res);
int times = Division(20, 10, out res); Console.WriteLine(res);//输出结果为2 Console.WriteLine(times);//times????


  因为不管发生异常与否都会执行finally里面的语句,那times应该是1。但结果两种情况下都是0。这是什么原因,这是因为在try中return了。用反编译的方式,我们可以看到,其实在try或者catch中return,相当于在声明了一个变量,把要return的值赋给变量,最后再在finally之后(其实是整个函数运行到最后)才返回这个变量,所以原来return回去的值是没有改变的。即使不写把times++写在finally之中,就写在后面,返回结果还是一样的。   (所以上面这个函数就不能这么写拉,我是故意错的哟,嘻嘻哈哈!!!)

  但如果是引用类型的话,由于传递的是地址,把地址赋给一个变量最后返回地址,返回的结果就看这个地址指向的内容的变化了。既然有缘看到这篇文章,自己试一下吧!(嘿嘿)

  又有一个疑问了,那finally有啥用???

  2、自定义异常

  一个try可以捕获多个异常,try和catch中都能再嵌套try和catch,如下:

          try            {                try                {                }                catch (Exception)                {                                        throw;                }            }            catch (DivideByZeroException de)            {                try                {                }                catch (Exception)                {                                        throw;                }            }            catch (OverflowException oe)            {            }            catch (Exception ex)            {            }            finally            {             }
Try_Catch_Finally

    这些异常都继承自Exception,所以也可以自定义异常。定义一个类继承自Exception就行了。如下:

 class MyException:Exception     {        public MyException():base()        {         }        public MyException(string msg):base( msg)        {            msg = "自定义异常";        }    }
自定义异常
          try            {                throw new  MyException();            }            catch (Exception ex)            {                Console.WriteLine(ex.Message );//输出引发类型为“Try_Catch_Finally.MyEexception”的异常                            }

  一个try中可以有多个catch,但是只能有一个finally;try至少要有catch或者finally,不能单独try;try ,catch,finally中可以均嵌套try_catch_finally;

  Finally,主要用于异常安全,当try中没有catch的时候,只能在finally中释放上一级资源。

 

  暂时先总结于此,边学边用再边补充  .. 。。o o 0