Ngoại lệ (Exception) cung cấp cách chuyển điều khiển từ một phần chương trình sang phần khác. Xử lý ngoại lệ C# xây dựng trên 4 từ khóa: try, catch, finally, throw.
- try: Khối mã có thể ném ngoại lệ. Theo sau bởi một hoặc nhiều catch.
- catch: Xử lý ngoại lệ tại nơi mong muốn. Chỉ định kiểu ngoại lệ bắt.
- finally: Luôn thực thi (có hoặc không có ngoại lệ). Dùng cho cleanup.
- throw: Ném ngoại lệ thủ công.
Ví dụ
using System;
namespace Demo
{
class DivNumbers
{
int result;
public DivNumbers()
{
result = 0;
}
public void Division(int num1, int num2)
{
try
{
result = num1 / num2;
}
catch (DivideByZeroException e)
{
Console.WriteLine("Ngoại lệ chia cho 0: {0}", e.Message);
}
catch (Exception e)
{
Console.WriteLine("Ngoại lệ khác: {0}", e.Message);
}
finally
{
Console.WriteLine("Kết quả: {0}", result);
}
}
static void Main(string[] args)
{
DivNumbers d = new DivNumbers();
d.Division(25, 0); // Gây DivideByZeroException
Console.ReadKey();
}
}
}
Kết quả
Ngoại lệ chia cho 0: Attempted to divide by zero. Kết quả: 0
Các nguyên tắc tốt
- Bắt ngoại lệ cụ thể trước, chung sau (
DivideByZeroExceptiontrướcException) - Luôn dùng
finallycho tài nguyên (file, connection, stream) - Tránh catch rỗng (
catch { }) - che giấu lỗi - Dùng
usingcho IDisposable (tự động gọi Dispose trong finally)
Ví dụ using (thay try/finally)
using (var fs = new FileStream("file.txt", FileMode.Open))
using (var sr = new StreamReader(fs))
{
string content = sr.ReadToEnd();
} // Tự động dispose, ngay cả khi có exception