ASP.NET Core Docs

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

"Chuyện gì đã xảy ra?" — Bắt và xử lý lỗi
  • Bắt exception trước khi user thấy stack trace
  • Trả ProblemDetails có 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 lại mọi thứ" — Theo dõi và debug
  • 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 Handling bắt lỗi và trả response phù hợp. Logging ghi lại chi tiết để developer debug sau. Bạn cần cả hai — handle mà không log = mất thông tin, log mà không handle = user thấy stack trace.

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:

ExceptionHandler
lưới an toàn
Routing
chọn endpoint
AuthN/AuthZ
xác thực
Controller
xử lý & throw
C#
// 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
UseExceptionHandler() phải là middleware ĐẦU TIÊN. Nếu đặt sau Routing hoặc Auth, exception từ các middleware đó sẽ không bị bắt — user nhận stack trace thay vì error response có cấu trúc.

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:

1 Global Exception Handler Middleware Recommended +

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.

2 Exception Filters MVC Filter +

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.

3 ProblemDetails Service .NET 7+ +

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.

4 Try-Catch trong Controller Avoid +

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:

ILoggerFactory

Tạo và quản lý tất cả loggers

ILoggerProvider (nhiều providers)
Console
Debug
Serilog
Seq
ILogger<T> (inject vào class)
LogTrace()
LogDebug()
LogInformation()
LogWarning()
LogError()
LogCritical()
Khi gọi 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: