使用try-catch-finally異常處理。try中寫可能出現異常的程式碼,如果出現異常,處理異常部分在catch,finally執行無論是否異常都執行的程式碼,比如非託管資源釋放等。
try當程式可能出現異常時,我們希望程式經過一些處理仍舊正常跑起來,可能出現異常的程式碼可以寫在這裡,一個try至少關聯一個catch或者finally。
catch可以有多個catch處理異常,出現異常時,第一個合適的catch將來處理,所以具體的異常一般寫在前面,如果寫在後面將會被前面的catch覆蓋了。
static void Main(string[] args) { try { int num1 = 0; int num2 = 10 / num1; } catch (DivideByZeroException e) { Console.WriteLine("嘗試除以零的異常..."); Console.ReadKey(); } catch { Console.WriteLine("其他異常..."); Console.ReadKey(); } }
上面程式碼異常會被DivideByZeroException捕捉到,當然,如果不指定DivideByZeroException異常,會被System.Exception捕捉。當具體的異常型別寫在後面的catch中,不指定型別的catch寫在前面,會產生編譯錯誤。
如果catch裡面程式碼又出現異常了,在這裡程式將會終止。
static void Main(string[] args) { try { throw new DivideByZeroException(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); throw new Exception(); } finally { Console.WriteLine("無論是否有異常都執行"); Console.ReadKey(); } }
為了讓程式更加健壯,catch裡如果選擇將異常資訊記錄日誌的話,如果throw再次丟擲,則上層程式碼會知道這個異常,然後可能出現異常的程式碼透過修正將會更安全,當然這個按需求來。catch裡面也可以什麼都沒有,此時出現了異常也無從而知,一般這種做法沒有多少人會採取吧,因為這樣只是讓程式看起來很“完美”罷了。
finally在try/catch之後加入finally,無論是否發生異常都會執行finally的程式碼。
結構化異常處理Exception類的StackTrace記錄了異常時呼叫的方法,以及一直遞迴到最上層的方法都有,這對除錯非常有用,Message的資訊也很有用。如果我們丟擲異常僅僅是Exception而不是具體的異常,則沒有具體型別的Message資訊多,對除錯可能不太友好,我們應該儘量丟擲具體型別的異常。
static void Main(string[] args) { try { throw new DivideByZeroException(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } finally { Console.WriteLine("this is finally"); } Console.ReadKey(); }
最新評論