try-finally 和 try-catch

try-finallytry-catch 都是用於處理程式碼中可能發生例外情況的結構,但它們的作用有所不同。

簡介

  1. try-catch
    • try-catch 結構用於捕獲和處理可能發生的例外情況。當 try 區塊中的程式碼拋出例外時,控制流程會轉移到 catch 區塊,這裡可以定義要處理或回應該例外的程式碼。
    • catch 區塊中可以捕獲特定類型的例外,也可以捕獲所有類型的例外(使用 catch (Exception ex))。您可以根據需要定義多個 catch 區塊,以處理不同類型的例外情況。
  2. try-finally
    • try-finally 結構用於確保某些程式碼段無論是否發生例外情況都會被執行,通常用於執行後續的清理工作或資源的釋放。
    • 即使 try 區塊中的程式碼拋出例外,finally 區塊中的程式碼也會被執行。這確保了清理工作的執行,即使出現了例外情況。

舉例

try-catch 的例子:

假設我們有一個函式,它嘗試將一個字串轉換為整數並進行計算。如果字串無法轉換為整數,我們希望能夠捕獲這個例外情況並處理它。

try {
    string input = "123abc";
    int number = int.Parse(input);
    int result = 100 / number;  // 假設計算過程中可能發生除零例外
    Console.WriteLine("Result: " + result);
} catch (FormatException ex) {
    Console.WriteLine("Input string is not in the correct format.");
} catch (DivideByZeroException ex) {
    Console.WriteLine("Cannot divide by zero.");
} catch (Exception ex) {
    Console.WriteLine("An error occurred: " + ex.Message);
}

在這個例子中,我們使用了 try-catch 結構來捕獲可能發生的 FormatException(當字串無法轉換為整數時)和 DivideByZeroException(當除零操作發生時)例外情況。如果發生這些例外情況,將會執行相應的 catch 區塊中的程式碼。

try-finally 的例子:

假設我們需要在函式中打開一個資源(例如檔案或資料庫連接),然後在後續的程式執行完畢後確保這個資源被正確關閉,無論是否發生了例外情況。

FileStream fileStream = null;
try {
    fileStream = new FileStream("example.txt", FileMode.Open);
    // 在此處執行其他操作,可能會拋出例外
} catch (IOException ex) {
    Console.WriteLine("An error occurred while processing the file: " + ex.Message);
} finally {
    // 確保在任何情況下都關閉資源
    if (fileStream != null) {
        fileStream.Close();
    }
}

在這個例子中,我們使用了 try-finally 結構來確保 fileStream 資源被正確關閉。無論是否發生了例外情況,finally 區塊中的程式碼都會被執行,從而確保資源的正確關閉。

結論

try-catch 用於捕獲和處理例外情況,而 try-finally 則用於確保某些程式碼段的執行,無論是否出現例外情況,以確保清理工作的完成。在某些情況下,可以結合使用這兩種結構,以實現更完整的例外處理機制。

Tags: