0
0
Lập trình
Admin Team
Admin Teamtechmely

Xử lý Ngoại lệ Toàn cầu trong .NET Web API

Đăng vào 1 tháng trước

• 4 phút đọc

Giới thiệu

Khi xây dựng API, một trong những sai lầm phổ biến nhất mà các lập trình viên mắc phải là phân tán các khối try-catch trong các controller. Điều này không chỉ làm cho mã nguồn trở nên lộn xộn mà còn dẫn đến việc phản hồi lỗi không đồng nhất cho khách hàng.

Giải pháp? Xử lý Ngoại lệ Toàn cầu bằng cách sử dụng middleware trong .NET Web API.

Tại sao cần Xử lý Ngoại lệ Toàn cầu?

  • Quản lý lỗi tập trung: Tất cả các ngoại lệ đều đi qua một pipeline duy nhất.
  • Phản hồi nhất quán: Khách hàng luôn nhận được thông điệp lỗi có cấu trúc.
  • Controller sạch hơn: Không cần khối try-catch lặp lại.
  • Ghi log tốt hơn: Dễ dàng ghi lại tất cả các ngoại lệ không được xử lý.

Bước 1: Tạo Middleware Xử lý Ngoại lệ

csharp Copy
public class GlobalExceptionMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<GlobalExceptionMiddleware> _logger;

    public GlobalExceptionMiddleware(RequestDelegate next, ILogger<GlobalExceptionMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Đã xảy ra ngoại lệ không được xử lý.");
            await HandleExceptionAsync(context, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

        var response = new
        {
            StatusCode = context.Response.StatusCode,
            Message = "Lỗi máy chủ nội bộ. Vui lòng thử lại sau.",
            Detail = exception.Message // Tùy chọn: xóa trong môi trường sản xuất
        };

        return context.Response.WriteAsJsonAsync(response);
    }
}

Bước 2: Đăng ký Middleware trong Program.cs

csharp Copy
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

// Thêm middleware xử lý ngoại lệ toàn cầu
app.UseMiddleware<GlobalExceptionMiddleware>();

app.MapControllers();
app.Run();

Bước 3: Kiểm tra Middleware

Thêm một controller ném ra ngoại lệ:

csharp Copy
[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
    [HttpGet("error")]
    public IActionResult GetError()
    {
        throw new InvalidOperationException("Đây là một ngoại lệ thử nghiệm.");
    }
}

Gọi GET /api/test/error và bạn sẽ nhận được một phản hồi JSON như sau:

json Copy
{
  "StatusCode": 500,
  "Message": "Lỗi máy chủ nội bộ. Vui lòng thử lại sau.",
  "Detail": "Đây là một ngoại lệ thử nghiệm."
}

Bước 4: Cải tiến Tùy chọn

  • Thông điệp nhận thức môi trường: Ẩn Detail trong môi trường sản xuất.
  • Các loại ngoại lệ tùy chỉnh: Xử lý các ngoại lệ xác thực khác nhau.
  • Ghi log có cấu trúc: Bao gồm các ID tương quan để theo dõi.
  • Chi tiết vấn đề theo RFC 7807: Trả về phản hồi lỗi tiêu chuẩn hóa.

Kết luận

Xử lý ngoại lệ toàn cầu giúp Web API của bạn sạch sẽ, nhất quán và dễ dàng duy trì. Bằng cách tập trung quản lý lỗi, bạn giải phóng các controller khỏi các khối try-catch lặp lại, làm cho việc ghi log dễ dàng hơn và đảm bảo rằng khách hàng luôn nhận được phản hồi dự đoán được.

Thực hành tốt nhất

  • Tạo các loại ngoại lệ cụ thể cho các tình huống khác nhau, giúp dễ dàng xử lý và ghi log.
  • Sử dụng các công cụ giám sát để theo dõi các ngoại lệ và cải thiện hiệu suất của ứng dụng.

Những cạm bẫy phổ biến

  • Bỏ qua ghi log cho các ngoại lệ, dẫn đến khó khăn trong việc khắc phục sự cố.
  • Không xử lý các loại ngoại lệ cụ thể có thể dẫn đến trải nghiệm người dùng kém.

Mẹo hiệu suất

  • Tối ưu hóa middleware để không làm chậm xử lý yêu cầu.
  • Sử dụng các thư viện ghi log hiệu quả để cải thiện tốc độ ghi log.

Câu hỏi thường gặp (FAQ)

1. Tại sao cần xử lý ngoại lệ toàn cầu?
Xử lý ngoại lệ toàn cầu giúp quản lý lỗi một cách tập trung và nhất quán, cải thiện chất lượng mã nguồn và trải nghiệm người dùng.

2. Làm thế nào để ẩn thông tin lỗi trong môi trường sản xuất?
Bạn có thể ẩn thuộc tính Detail trong phản hồi JSON để bảo mật thông tin.

3. Có nên sử dụng các loại ngoại lệ tùy chỉnh không?
Có, điều này giúp phân loại và xử lý các ngoại lệ một cách dễ dàng hơn trong ứng dụng của bạn.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào