Xử lý lỗi tập trung trong .NET

Nếu ứng dụng của bạn dùng quá nhiều khối lệnh try-catch thì có thể bạn đang bị duplicate xử lý lỗi ở nhiều nơi khác nhau. Có nhiều cách để xử lý lỗi tập trung tại 1 nơi. Bài viết này sẽ giúp ích cho bạn.

Vài năm trước các phương phức code của chúng ta bắt lỗi dạng như thế này:

 

Rất đơn giản, khi ta muốn cập nhật chi tiết của Employee, có nhiều điều kiện khác nhau mà có thể xảy ra lỗi. Chúng ta có thể bắt nó ngay trong chính method này. Nhưng có vẻ nếu chỗ nào cũng code thế này thì code bị duplicate nhiều quá.

Sử dụng Exception filter để bắt exception tập trung

.NET đưa ra một cách xử lý bắt lỗi toàn bộ ứng dụng ở 1 chỗ trong Request Pipeline. Việc cần làm là add một class kế thừa từ IExceptionFilter:

 

Sau khi xong, bạn sẽ lắp nó vào một nơi trong Request Pipeline. (Thứ tự trong ConfigureServices sẽ là thứ tự thực hiện các middleware trong Request Pipeline). Bạn sẽ đặt như sau:

 

Vậy là xong việc xử lý. Giờ hãy thực hiện thân hàm OnException nhé. Đơn giản chúng ta chỉ cần chuyển các nội dung bắt lỗi trùng nhau vào 1 chỗ trong OnException thôi:

 

Nghĩa là hông cần phải bắt lỗi ở trong Controller, Service hoặc các chỗ khác nữa. Mà trong đó chúng ta chỉ cần check điều kiện và throw ra Exception nếu muốn. Sau đó chúng sẽ được thu gom lại ở 1 chỗ duy nhất là Filter.

 

Throw một custom exception

Ném exception là việc bình thường trong code. Có 2 loại là ném ra chủ động tường minh chúng ta có thể biết được trong code, ngoài ra có các unhandled exception tức các exception mà chúng ta không chủ động xử lý được. Cái này nó cũng được xử lý mặc định vào Filter. Còn ở đây nói đến việc chủ động ném ra lỗi:

 

Và cũng có thể bổ sung việc bắt lỗi vừa ném ra trong OnException method:

 

Nên giờ code sẽ từ:

 

trở thành:

 

Đây chỉ là một ví dụ nhỏ, nhưng ý chính là việc tập trung hóa việc xử lý lỗi trong API của bạn giúp code đơn giản hơn, đỡ bị duplicate và thống nhất trong việc xử lý lỗi.

Xem qua các loại filter khác

Bên cạnh IExceptionFilter, .NET còn hỗ trợ nhiều loại filter khác với mục đích khác như:

  • IAuthenticationFilter
  • IAuthorizationFilter
  • IActionFilterThese
  • IResourceFilter
  • IResultFilter

Chúng được chỉ ra thứ tự trong Request Pipeline: https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-5.0

Tóm lại

Các bước để bắt lỗi tập trung:

  1. Thêm class kế thừa IExceptionFilter
  2. Thêm code xử lý lỗi vào method OnException
  3. Gắn Filter vào method ConfigureServices trong Startup.cs
  4. Xóa các dòng Try-catch
  5. Throw exception ra ngoài nếu muốn

Trích nguồn từ: (https://medium.com/vx-company/centralize-your-net-exception-handling-with-filters-a1e0fccf17b8)

Lên trên