Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Từ khóa finally trong C#

Khái niệm

Khối finally được dùng để chứa mã **luôn được thực thi** dù có ngoại lệ xảy ra hay không. Thường dùng để giải phóng tài nguyên (đóng file, kết nối DB, stream...).

Cú pháp

try
{
    // Code có thể gây exception
}
catch (ExceptionType1 e1)
{
    // Xử lý exception loại 1
}
catch (ExceptionType2 e2)
{
    // Xử lý exception loại 2
}
finally
{
    // Code cleanup - luôn chạy
}

Ví dụ: Xử lý chia cho 0

using System;

public class Demo
{
    int result;

    public Demo()
    {
        result = 0;
    }

    public void Division(int num1, int num2)
    {
        try
        {
            result = num1 / num2; // Gây DivideByZeroException nếu num2 = 0
        }
        catch (DivideByZeroException e)
        {
            Console.WriteLine($"Exception caught: {e.Message}");
        }
        finally
        {
            // Luôn in kết quả (dù có exception hay không)
            Console.WriteLine($"Result = {result}");
        }
    }

    public static void Main(string[] args)
    {
        Demo d = new Demo();
        d.Division(100, 0);
    }
}

Kết quả

Exception caught: Attempted to divide by zero.
Result = 0

Đặc điểm quan trọng

  • finally chạy **sau** try và catch (nếu có).
  • Chạy ngay cả khi có return trong try hoặc catch.
  • Không chạy nếu tiến trình bị kill đột ngột (Environment.FailFast, crash, power loss).
  • Thường dùng cho: file.Close(), conn.Dispose(), lock.Release().

Best Practice: Sử dụng using hoặc IDisposable

Thay vì try/finally thủ công, hãy dùng câu lệnh using (tự động gọi Dispose trong finally):

using (var fs = new FileStream("test.txt", FileMode.Open))
{
    // Đọc/ghi file
} // fs.Dispose() tự động gọi ở đây (tương đương finally)