標籤: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