//Mình code C#
Mình có 1 số thắc mắc về việc throw exception trong code sau.
Bài toán đặt ra là project mình là web api, có các layer là controller => service => repository.
1. Khi validate business logic, ví dụ validate mật khẩu user sai/ đúng thì khi sai có nên throw exception không ? Nếu không throw thì sẽ viết code xử lý trường hợp sai như nào
2. Mình hay nghe senior team mình nói throw sai có thể làm lost stack trace khó debug, mình không hiểu ý này có bác nào giải thích mình với
3. Nên viết catch exception ở layer nào? Khi nào nên re-throw lại exception?
1. Khi validate business logic, ví dụ validate mật khẩu user sai/ đúng thì khi sai có nên throw exception không ? Nếu không throw thì sẽ viết code xử lý trường hợp sai như nào
Cách tốt nhất là throw exception khi validate business logic sai. Điều này sẽ giúp bạn dễ dàng debug và tìm ra nguyên nhân của lỗi. Nếu không throw exception, bạn sẽ phải viết code xử lý trường hợp sai, điều này có thể gây khó khăn cho việc debug và có thể dẫn đến các lỗi khác.
Ví dụ, nếu bạn đang validate mật khẩu user, bạn có thể throw exception nếu mật khẩu không đáp ứng các yêu cầu về độ dài, độ phức tạp, v.v. Điều này sẽ giúp bạn dễ dàng tìm ra nguyên nhân của lỗi và khắc phục nó.
2. Mình hay nghe senior team mình nói throw sai có thể làm lost stack trace khó debug, mình không hiểu ý này có bác nào giải thích mình với
Stack trace là một danh sách các phương thức đã được gọi dẫn đến việc ném ngoại lệ. Nó rất hữu ích cho việc debug ngoại lệ vì nó giúp bạn xác định phương thức mà lỗi đã xảy ra.
Nếu bạn throw exception sai, stack trace có thể bị mất. Điều này sẽ khiến việc debug ngoại lệ trở nên khó khăn hơn vì bạn sẽ không thể xác định phương thức mà lỗi đã xảy ra.
Ví dụ, nếu bạn đang throw exception từ một phương thức trong lớp Service, stack trace sẽ bao gồm tên của phương thức Service và các phương thức mà nó đã gọi. Nếu bạn throw exception từ một phương thức trong lớp Controller, stack trace sẽ không bao gồm tên của phương thức Service và các phương thức mà nó đã gọi. Điều này sẽ khiến việc debug ngoại lệ trở nên khó khăn hơn vì bạn sẽ không thể xác định phương thức mà lỗi đã xảy ra.
3. Nên viết catch exception ở layer nào? Khi nào nên re-throw lại exception?
Bạn nên viết catch exception ở layer gần nhất với nơi xảy ra lỗi. Điều này sẽ giúp bạn xử lý lỗi hiệu quả hơn và ngăn lỗi lan truyền sang các layer khác.
Ví dụ, nếu bạn đang validate mật khẩu user trong lớp Service, bạn nên viết catch exception trong lớp Service. Điều này sẽ giúp bạn xử lý lỗi hiệu quả hơn và ngăn lỗi lan truyền sang lớp Controller.
Bạn chỉ nên re-throw exception khi bạn không thể xử lý lỗi ở layer hiện tại. Ví dụ, nếu bạn đang validate mật khẩu user trong lớp Service, nhưng bạn không thể xử lý lỗi ở layer này, bạn có thể re-throw exception lên lớp Controller.