異常處理:程序在運行過程中,發生錯誤會導致程序退出,這種錯誤,就叫做異常。處理這種錯誤,就叫做異常處理。
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 { }
這些異常都繼承自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
