例外處理,可以處理一些未知且發生錯誤的情況,例如: 輸入不合法(型別不符)的值、找不到要開啟的資料、處理資料時突然失去連線…。

在C# 例外處理使用 try-catch 陳述式

只要將一般陳述式放在try區塊,

當try區塊發生發生時,就會移向catch區塊,用Exception擷取錯誤

例如:

try
{
    int[] ary = new int[] { 1, 2, 3 };
    Console.Write(ary[11]);
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

Exception types

前面提到,catch可以透過Exception來捕捉錯誤

並且,你也可以指定要捕捉哪種 Exception 錯誤

例如,捕捉找不到檔案時發生的錯誤、記憶體不足的錯誤…等

常見的 Exceptio 型別:

Exception types 說明
DivideByZeroException 出現了"除以零"的錯誤形況
FileNotFoundException 找不到檔案的錯誤形況
FormatException 轉換數字、字串(例如: ToString、Parse..)發生錯誤、或使用複合格式、使用佔位符(例如:String.Format 和 Console.WriteLine…)等輸出字串時發生錯誤
IndexOutOfRangeException 陣列或集合的索引值不正確(不存在或小於0)
InvalidOperationException 呼叫物件的方法時,發生錯誤
OutOfMemoryException 記憶體不足
Exception 所有錯誤狀況發生時

範例:

try
{
    int[] ary = new int[] { 1, 2, 3 };
    Console.Write(ary[11]);
}
//處理記憶體不足發生的情況
catch (OutOfMemoryException e) {
  Console.WriteLine("Out of Memory");
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

Finally

try-catch 也可以搭配 Finally

無論是否拋出異常,都會執行finally區塊。

Finally 會放在 catch 之後 例如:

try
{
    int[] ary = new int[] { 1, 2, 3 };
    Console.Write(ary[11]);
}
catch (OutOfMemoryException e) {
  Console.WriteLine("Out of Memory");
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}
finally {
  Console.WriteLine("一定會執行");
}