當處理錯誤和例外狀況時,可以使用C#中的 try、catch、finally 來有效地處理不同類型的異常情況。
try-catch 處理異常:程式語法:
try
{
    // 可能引發異常的程式碼
}
catch (ExceptionType1 ex)
{
    // 處理 ExceptionType1 類型的異常
}
catch (ExceptionType2 ex)
{
    // 處理 ExceptionType2 類型的異常
}
// 可以添加更多的 catch 塊處理不同類型的異常
PS. 從上到下,依照指定的順序檢查 catch 子句。 因此最多只會針對例外狀況執行一個 catch 區塊。
程式範例(處理數學除法中的異常):
class Program
{
    static void Main()
    {
        int dividend = 10;
        int divisor = 0;
        try
        {
            int result = dividend / divisor; // 數學除法,會引發 DivideByZeroException
            Console.WriteLine("結果:" + result);
        }
        catch (DivideByZeroException ex)
        {
            Console.WriteLine("除以零異常:" + ex.Message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("其他異常:" + ex.Message);
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("Processing is cancelled.");
        }
    }
}
在此範例中,我們嘗試將 10 除以 0,這將引發 DivideByZeroException。
我們使用 try-catch 捕捉這個異常並處理它。
PS.
如上述範例所示,您可以省略例外狀況變數的宣告,並指定 catch 子句中的例外狀況類型。
但不含任何指定例外狀況類型的 catch 子句符合任何例外狀況,
如果存在,則必須是最後一個 catch 子句。
try-catch when 處理異常:when 子句,以便根據特定條件捕捉異常。程式語法:
try
{
    // 可能引發異常的程式碼
}
catch (ExceptionType ex) when (condition)
{
    // 當滿足條件時處理異常
}
程式範例(處理索引範圍的異常):
class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4, 5 };
        int index = 10;
        try
        {
            int value = numbers[index];
            Console.WriteLine("取得數字:" + value);
        }
        catch (IndexOutOfRangeException ex) when (index < 0 || index >= numbers.Length)
        {
            Console.WriteLine("索引超出範圍:" + ex.Message);
        }
        catch (IndexOutOfRangeException ex)
        {
            Console.WriteLine("一般索引超出範圍:" + ex.Message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("其他異常:" + ex.Message);
        }
    }
}
在這個範例中,我們嘗試獲取數組中索引為 10 的數字,這將引發 IndexOutOfRangeException。但是,我們使用了 try-catch when,在第一個 catch 中,我們僅在索引小於 0 或大於等於數組長度時處理該異常。如果索引在其他範圍內,將執行第二個 catch 。
我們能夠根據特定條件更細致地處理不同情況下的異常。
finally:程式語法:
try
{
    // 可能引發異常的程式碼
}
catch (Exception ex)
{
    // 處理異常
}
finally
{
    // 無論是否發生異常,都會執行的程式碼
}
程式範例(使用 finally 清理資源):
 class Program
{
    static void Main()
    {
        FileStream file = null;
        try
        {
            file = new FileStream("sample.txt", FileMode.Open);
            // 使用文件
        }
        catch (FileNotFoundException ex)
        {
            Console.WriteLine("文件未找到:" + ex.Message);
        }
        finally
        {
            // 確保關閉文件,無論是否發生異常
            if (file != null)
            {
                file.Close();
            }
        }
    }
}
在此範例中,我們打開一個文件來進行讀取操作,然後使用 finally 確保無論是否發生異常,都會關閉文件。
使用 throw 陳述句引發自定義異常:
可以使用 throw 陳述句來引發自定義異常,以便在特定情況下通知程式的使用者。
程式範例:
try
{
    // 可能引發異常的程式碼
    if (someCondition)
    {
        throw new CustomException("自定義異常消息");
    }
}
catch (CustomException ex)
{
    Console.WriteLine("自定義異常:" + ex.Message);
}
   例外狀況|	條件
   ------------- | -------------
   ArgumentException  |  傳遞至方法的非 Null 引數無效。
   ArgumentNullException  |  傳遞至方法的引數為 null 。
   ArgumentOutOfRangeException  |  引數超出有效值的範圍。
   DirectoryNotFoundException  |  目錄路徑的一部分無效。
   DivideByZeroException  |  整數或 Decimal 除法運算中的分母為零。
   DriveNotFoundException  |  磁片磁碟機無法使用或不存在。
   FileNotFoundException  |  檔案不存在。
   FormatException  |  值不是適當的格式,無法透過轉換方法從字串轉換,例如 Parse 。
   IndexOutOfRangeException  |  索引超出陣列或集合的界限。
   InvalidOperationException  |  方法呼叫在物件的目前狀態中無效。
   KeyNotFoundException  |  找不到存取集合中成員的指定索引鍵。
   NotImplementedException  |  未實作方法或作業。
   NotSupportedException  |  不支援方法或作業。
   ObjectDisposedException  |  作業會在已處置的物件上執行。
   OverflowException  |  算術、轉型或轉換運算會導致溢位。
   PathTooLongException  |  路徑或檔案名超過系統定義的長度上限。
   PlatformNotSupportedException  |  目前平臺不支援此作業。
   RankException  |  維度數目錯誤的陣列會傳遞至 方法。
   TimeoutException  |  配置給作業的時間間隔已過期。
   UriFormatException  |  使用不正確統一資源識別項 (URI) 。
期望挑戰30天持續更新成功 ~ DAY11