【又長見識了】C#異常處理,try、catch、finally、throw

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   io   strong   ar   

  

  異常處理:程式在運行過程中,發生錯誤會導致程式退出,這種錯誤,就叫做異常。處理這種錯誤,就叫做異常處理。

  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 

  

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.