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:
- Thêm class kế thừa IExceptionFilter
- Thêm code xử lý lỗi vào method OnException
- Gắn Filter vào method ConfigureServices trong Startup.cs
- Xóa các dòng Try-catch
- 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
Bài viết liên quan
Sử dụng kiểu tập hợp (Enum)
Enum (viết tắt của Enumeration) trong C# là một kiểu dữ liệu đặc biệt cho phép bạn định nghĩa một tập hợp các hằng số có tên
Đọc thêmTính đóng gói (Encapsulation) và best practices trong OOP
(Tính đóng gói) là một trong những nguyên tắc cơ bản của lập trình hướng đối tượng (OOP).
Đọc thêmTính trừu tượng - Abstract classes and interfaces
Tính trừu tượng (Abstraction) trong OOP là kỹ thuật ẩn đi các chi tiết triển khai và chỉ hiển thị cho người dùng những chức năng cần thiết.
Đọc thêmTính chất kế thừa (Inheritance) và đa hình (polymorphism)
Kế thừa là cơ chế cho phép một lớp (class) kế thừa các thuộc tính và phương thức từ một lớp khác.
Đọc thêmCách debug ứng dụng C#
Hướng dẫn cách debug chương trình C# trong Visual Studio và Visual Studio Code
Đọc thêmTìm hiểu về các loại Collection trong C#
Trong C#, collections là các cấu trúc dữ liệu được sử dụng để lưu trữ và quản lý các nhóm đối tượng. C# cung cấp nhiều loại collections khác nhau để phù hợp với các yêu cầu cụ thể của lập trình viên
Đọc thêmTổng quan về Generic và Non-Generic Collection
Hiểu khái niệm Generic và Non-Generic Collection và phân biệt giữa Generic Collection và Non-Generic Collection.
Đọc thêmSử dụng mảng (Arrays)
Mảng trong C# là một cấu trúc dữ liệu lưu trữ một dãy các phần tử có bộ nhớ nằm liên tiếp nhau và có kích thước cố đinh.
Đọc thêmLập trình hướng đối tượng
Lập trình hướng đối tượng (Object Oriented Programing) hay còn gọi là OOP. Là một kỹ thuật lập trình cho phép các lập trình viên có thể ánh xạ các thực thể bên ngoài đời thực và trừu tượng hoá thành các class và object trong mã nguồn.
Đọc thêmVòng lặp (loop)
Trong thực tế khi bạn cần thực thi một khối lệnh nhiều lần. Vòng lặp cho phép chúng ta thực thi một câu lệnh hoặc một khối lệnh nhiều lần.
Đọc thêm