首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# try-catch-finally 確保資源釋放的關鍵機制

     編輯:關於C#

核心概念

finally 區塊無論是否發生異常、是否執行 return、break、continue,一定會執行(極少數環境終止除外)。專為資源清理設計:關閉檔案、釋放連線、釋放鎖定等。

完整範例

using System;

public class MainClass
{
    static void Main()
    {
        int i = 123;
        string s = "Some string";
        object o = s;

        try
        {
            i = (int)o; // 無效轉換,拋出 InvalidCastException
        }
        catch { } // 吞掉異常(示範用,實務不建議)

        finally
        {
            Console.Write("i = {0}", i); // 一定執行,輸出 123
        }

        Console.Read();
    }
}

執行流程圖解

正常流程:try 完成 → finally → 後續代碼
異常流程:try 拋異常 → catch 處理 → finally → 後續代碼
無 catch:try 拋異常 → finally → 傳遞給上層呼叫者
try 中 return:執行 finally → 返回呼叫者

實務應用模式:資源釋放標準寫法

// 傳統寫法(需手動釋放)
StreamWriter sw = null;
try
{
    sw = new StreamWriter("log.txt");
    sw.WriteLine("資料");
}
finally
{
    sw?.Close(); // C# 6+ null 條件運算子
}

// 現代寫法:using 區塊(編譯器自動產生 try-finally)
using (var sw = new StreamWriter("log.txt"))
{
    sw.WriteLine("資料");
} // 此處自動呼叫 Dispose() → Close()

⚠️ 特殊情況:finally 不執行的極端案例

  • Environment.FailFast() 立即終止進程
  • 進程被作業系統強制終止 (Task Manager / kill -9)
  • 執行緒被 Thread.Abort() 中止(.NET Framework 行為複雜,.NET Core 已移除)
  • 無限迴圈或死鎖卡在 try 區塊

總結

finally 是資源管理的安全網。現代 C# 開發請優先使用 using / await using(C# 8+)配合 IDisposable/IAsyncDisposable,讓編譯器自動生成正確的 try-finally 模式,減少手寫錯誤風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved