try-finally
和 try-catch
都是用於處理程式碼中可能發生例外情況的結構,但它們的作用有所不同。
簡介
try-catch
:try-catch
結構用於捕獲和處理可能發生的例外情況。當try
區塊中的程式碼拋出例外時,控制流程會轉移到catch
區塊,這裡可以定義要處理或回應該例外的程式碼。catch
區塊中可以捕獲特定類型的例外,也可以捕獲所有類型的例外(使用catch (Exception ex)
)。您可以根據需要定義多個catch
區塊,以處理不同類型的例外情況。
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
則用於確保某些程式碼段的執行,無論是否出現例外情況,以確保清理工作的完成。在某些情況下,可以結合使用這兩種結構,以實現更完整的例外處理機制。