Xử lý Exception trong ASP.NET Core

Xử lý ngoại lệ (exception handling) là một trong những tính năng quan trọng nhất của bất kỳ ứng dụng nào. May mắn thay, ASP.NET Core có một middleware giúp xử lý ngoại lệ dễ dàng. Trong chương này, chúng ta sẽ tìm hiểu về cách xử lý exception trong ứng dụng ASP.NET Core.

Bạn có thể truy cập Hướng dẫn lập trình ASP.NET Core để không bỏ lỡ bất kỳ bài viết nào của chúng tôi.

Theo mặc định, ASP.NET Core trả về một mã trạng thái đơn giản cho bất kỳ ngoại lệ nào xảy ra trong một ứng dụng. Hãy xem ví dụ sau, chỉnh sửa phương thức Configure để nó ném ra một exception.

public class Startup
{
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {            
        app.Run(context => { throw new Exception("error"); });
    }
}

Khi chạy ứng dụng, đoạn mã trên sẽ gây ra lỗi và chương trình hiển thị kết quả sau.

Trang hiện thông báo lỗi chưa được xử lý trong ASP.NET Core

Cài đặt gói Microsoft.AspNetCore.Diagnostics

Để xử lý các trường hợp ngoại lệ và hiển thị các thông báo thân thiện với người dùng, chúng ta cần cài đặt gói Microsoft.AspNetCore.Diagnostics từ NuGet và thêm middleware trong phương thức Configure().

Nếu bạn đang sử dụng các mẫu của Visual Studio để tạo ứng dụng ASP.NET Core thì gói này đã được cài đặt sẵn. Nếu không thì bạn có thể từ thêm gói Microsoft.AspNetCore.Diagnostics thông qua trình quản lý NuGet.

Gói Microsoft.AspNetCore.Diagnostics gồm nhiều phương thức mở rộng để xử lý ngoại lệ theo nhiều kịch bản khác nhau:

  1. UseDeveloperExceptionPage
  2. UseExceptionHandler

UseDeveloperExceptionPage

Phương thức mở rộng UseDeveloperExceptionPage thêm middleware vào đường ống yêu cầu. Nó hiển thị rất chi tiết các thông báo lỗi, điều này giúp các nhà phát triển truy tìm các lỗi xảy ra trong giai đoạn phát triển.

Vì middleware này hiển thị các thông tin nhạy cảm, nên chúng ta chỉ thêm nó trong môi trường phát triển. Ví dụ sau minh họa điều này:

public class Startup
{
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment() || env.IsStaging())
        {
            app.UseDeveloperExceptionPage();
        }

        app.Run(context => { throw new Exception("error"); });
    }
}

Đoạn mã trên sẽ hiển thị kết quả sau.

Xử lý exception trong ASP.NET Core

Như bạn có thể thấy ở trên, trang ngoại lệ của nhà phát triển bao gồm 4 tab: Stack, Query, Cookies và Headers. Tab Stack hiển thị thông tin của dấu vết ngăn xếp, cho biết chính xác nơi xảy ra lỗi. Tab Query hiển thị thông tin về chuỗi truy vấn. Tab Cookies hiển thị thông tin về cookie được thiết lập theo yêu cầu và tab Headers hiển thị thông tin về các tiêu đề.

UseExceptionHandler

Trong môi trường Production, chúng ta cần giấu đi các thông tin lỗi nhạy cảm đồng thời đưa ra các thông báo lỗi thân thiện với người sử dụng. Phương thức mở rộng UseExceptionHandler sẽ giúp chúng ta làm điều này.

Phương thức mở rộng UseExceptionHandler cho phép chúng ta cấu hình tùy chỉnh đường dẫn tới trang xử lý lỗi. Điều này rất hữu ích khi một ứng dụng chạy trong môi trường Production.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{

    if (env.IsDevelopment() || env.IsStaging())
    {
        app.UseDeveloperExceptionPage();
    }
    else 
    {
        app.UseExceptionHandler("/Home/Error");
    }

    //code removed for clarity 
}

Trong ví dụ trên, phương thức mở rộng UseExceptionHandler("/Home/Error") thiết lập đường dẫn tới trang xử lý lỗi. Nếu xảy ra lỗi trong ứng dụng ASP.NET Core thì nó sẽ chuyển hướng yêu cầu đến đường dẫn /home/error, nó sẽ thực thi action Error của HomeController.

Tạo một action Error đơn giản trong lớp HomeController như dưới đây.

public class HomeController : Controller
{
    public HomeController()
    {
    }

    public IActionResult Error()
    {
        return View();
    } 

    // other code removed for the clarity

}

Sau đây là nội dung của Error.cshtml.

@{
    ViewData["Title"] = "Error";
}

<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>

<h3>Development Mode</h3>
<p>
    Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
    <strong>Development environment should not be enabled in deployed applications</strong>, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>, and restarting the application.
</p>

Bây giờ, khi xảy ra lỗi, nó sẽ hiển thị trang hiển thị bên dưới.

Trang thông báo lỗi tùy chỉnh trong ASP.NET Core

Như vậy là chúng ta đã tìm hiểu xong về cấu hình middleware để xử lý các ngoại lệ trong ứng dụng ASP.NET Core.

Lưu ý: Visual Studio tự động tạo Error.cshtml trong thư mục Home khi bạn tạo project ASP.NET Core với mẫu MVC.


Bài viết liên quan:

View Layout, View Start, View Imports là gì? Lợi ích và các sử dụng View Layout, View Start, View Imports trong ASP.NET Core.

Tất tần tật về View, Razor View, Layout View, View Start, View Import, Tag Helpers trong ASP.NET Core MVC.

ActionResult trong ASP.NET Core là gì? Có những loại ActionResult nào? Làm sao để sử dụng ActionResult trong ASP.NET Core.