【又長見識了】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 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM