zoukankan      html  css  js  c++  java
  • 【又长见识了】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之中,就写在后面,返回结果还是一样的。   (所以上面这个函数就不能这么写拉,我是故意错的哟,嘻嘻哈哈!!!)

      finnally中还是执行了times++的。

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

      又有一个疑问了,那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:

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

      using 的用法,就是最后自动dispose,它内部的原理就是利用了try-finally,在finally中dispose;

         Using:

      顺便说一下using的用法,使用using可以在using作用域结束后自动释放资源(dispose),要使用using,类必须继承了Idispose方法才行。

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

      

      

  • 相关阅读:
    如何:为 Silverlight 客户端生成双工服务
    Microsoft Sync Framework 2.1 软件开发包 (SDK)
    Windows 下的安装phpMoAdmin
    asp.net安全检测工具 Padding Oracle 检测
    HTTP Basic Authentication for RESTFul Service
    Windows系统性能分析
    Windows Server AppFabric Management Pack for Operations Manager 2007
    Mongo Database 性能优化
    服务器未能识别 HTTP 标头 SOAPAction 的值
    TCP WAIT状态及其对繁忙的服务器的影响
  • 原文地址:https://www.cnblogs.com/wangliu/p/3915336.html
Copyright © 2011-2022 走看看