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
finallychạy **sau** try và catch (nếu có).- Chạy ngay cả khi có
returntrong 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)