異常處理:程序在運行過程當中,發生錯誤會致使程序退出,這種錯誤,就叫作異常。處理這種錯誤,就叫作異常處理。安全
一、輕描淡寫Try、Catch、Finally、throw用法ide
在異常處理中,首先須要對可能發生異常的語句進行異常捕捉,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則用於拋出異常,把異常返回給程序,出了異常,固然程序就會中斷啦,會拋出異常。spa
再看一個例子:try和catch中存在retrun的狀況code
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--;blog
} 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有啥用???string
二、自定義異常
一個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