Exception Handling
& Logging
Xử lý lỗi có cấu trúc, ghi log chi tiết — nền tảng của mọi production app
Hai cột lõi của Production App
Một ứng dụng production cần hai thứ: bắt lỗi trước khi user thấy, và ghi lại chi tiết để developer debug. Hai hệ thống này phối hợp chặt chẽ.
Exception Handling
- Bắt exception trước khi user thấy stack trace
- Trả
ProblemDetailscó cấu trúc (RFC 7807) - Phân biệt lỗi client (4xx) vs server (5xx)
- Map exception type → HTTP status code
- Giữ cho API response luôn nhất quán
Logging
- Ghi thông tin debug, warning, error
- Structured logging với message templates
- Hỗ trợ nhiều providers (Console, Serilog, Seq)
- Log levels để lọc theo mức độ nghiêm trọng
- Correlation ID để trace request xuyên suốt
Exception trong Request Pipeline
Trong ASP.NET Core, ExceptionHandler middleware đặt ở đầu pipeline hoạt động như một lưới an
toàn. Bất kỳ exception nào throw từ bên trong đều bị bắt tại đây:
// Program.cs — Thứ tự middleware CỰC KỲ quan trọng! var app = builder.Build(); app.UseExceptionHandler(); // 1. ĐẦU TIÊN — bắt mọi exception app.UseRouting(); // 2. Xác định endpoint app.UseAuthentication(); // 3. Xác thực app.UseAuthorization(); // 4. Phân quyền app.MapControllers(); // 5. Chạy endpoint
4 Cách xử lý Exception
ASP.NET Core cung cấp nhiều cách xử lý exception. Chọn đúng cách cho đúng tình huống:
Cách tiếp cận chính — bắt MỌI exception trong pipeline.
Từ .NET 8, dùng IExceptionHandler interface. Trước .NET 8, dùng
UseExceptionHandler() lambda. Handler nhận exception, log chi tiết, và trả
ProblemDetails response.
Ưu điểm: Bắt tất cả, DI-friendly, có thể chain nhiều handlers, tách biệt logic xử lý lỗi khỏi business logic.
Chỉ bắt exception trong controller actions và filters.
Implement IExceptionFilter hoặc kế thừa ExceptionFilterAttribute. Hữu ích khi
cần xử lý lỗi khác nhau theo controller.
Giới hạn: KHÔNG bắt exception từ middleware, model binding, routing. Phải kết hợp với Global Handler.
Tự động format mọi error response theo chuẩn RFC 7807.
Đăng ký AddProblemDetails() — ASP.NET tự động tạo ProblemDetails cho mọi error status
code. Kết hợp với ExceptionHandler để tạo response chuẩn.
Ưu điểm: Response nhất quán, có type/title/status/detail/traceId. Client dễ parse.
Không khuyến khích — lặp lại code, dễ quên, khó maintain.
Mỗi action method phải có try-catch riêng. Copy-paste error handling code khắp nơi. Nếu quên một chỗ, user thấy stack trace.
Vấn đề: Vi phạm DRY, không bắt được exception từ middleware/filters, controller phình to.
Kiến trúc Logging
Hệ thống logging trong ASP.NET Core gồm 3 thành phần chính:
Tạo và quản lý tất cả loggers
logger.LogError(), message được gửi đến tất cả providers đã đăng ký
(Console, Serilog, Seq...). Mỗi provider tự quyết định cách ghi (console, file, database, cloud).
Khám phá chi tiết
Chọn chủ đề bạn muốn tìm hiểu sâu hơn: