iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
Software Development

C# 學習之路系列 第 12

[DAY11] C#基礎與實作(錯誤/例外處理)

  • 分享至 

  • xImage
  •  

C# 程式基礎

當處理錯誤和例外狀況時,可以使用C#中的 trycatchfinally 來有效地處理不同類型的異常情況。

錯誤/例外處理:

  1. 使用 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 子句。

  1. (補充) 使用 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

    我們能夠根據特定條件更細致地處理不同情況下的異常。

  1. 使用 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 確保無論是否發生異常,都會關閉文件。

  1. 使用 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) 。

引用於 microsoft Exception 類別

程式實作練習:

參考來源

  1. ChatGPT
  2. C#最強入門邁向頂尖高手之路王者歸來
  3. w3schools C#
  4. microsoft例外狀況處理語句
  5. microsoft Exception 類別

期望挑戰30天持續更新成功 ~ DAY11


上一篇
[DAY10] C#基礎與實作(委派. 事件)
下一篇
[DAY12] C#基礎與實作(字串處理)
系列文
C# 學習之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言