Làm thế nào để bạn xử lý các ngoại lệ trong Rails?
Xử lý các ngoại lệ trong các ứng dụng API của bạn là một điều khá quan trọng và nếu bạn muốn giữ mọi thứ KHÔ, bạn nên nghĩ cách thực hiện nó theo cách thích hợp. Trong khóa học API Ruby on Rails của chúng tôi, tôi đã chỉ ra cách triển khai xử lý lỗi bằng cách sử dụng ErrorSerializer và ActiveModelSerializers gem và ở đây tôi sẽ chỉ cho bạn cách tiếp cận tốt hơn nữa đối với chủ đề này khi bạn có thể thống nhất MỌI lỗi trên toàn bộ ứng dụng API API REST của Ruby On Railshướng dẫn đầy đủTạo các ứng dụng API chuyên nghiệp mà bạn có thể kết nối mọi thứ vào. Tìm hiểu cách viết mã như các chuyên gia bằng cách sử dụng Phát triển theo hướng thử nghiệm Tham gia khóa học này
Cách tiếp cận cuối cùngKhông cần thiết phải đề cập đến toàn bộ quá trình suy nghĩ về cách chúng tôi đi đến kết quả cuối cùng, nhưng nếu bạn quan tâm đến bất kỳ phần cụ thể nào, hãy nói điều đó trong phần nhận xét. Các giả định cơ bản là giữ cho mọi thứ KHÔ và thống nhất trên toàn bộ ứng dụng Vì vậy, đây là mã lỗi tiêu chuẩn
Trước hết, chúng tôi cần có lỗi Cơ sở, đây sẽ là lỗi dự phòng cho bất kỳ ngoại lệ nào do ứng dụng của chúng tôi đưa ra. Khi chúng tôi sử dụng API JSON trong phản hồi của mọi máy chủ, chúng tôi muốn luôn trả về lỗi ở định dạng mà API JSON mô tả Chúng tôi đã trích xuất tất cả các phần dành riêng cho lỗi cho mọi mã trạng thái HTML mà chúng tôi muốn hỗ trợ, có dự phòng là 500 Lỗi chi tiết hơnNhư bạn có thể thấy lỗi cơ bản này chỉ là một giàn giáo mà chúng ta có thể sử dụng để ghi đè lên các thuộc tính cụ thể của đối tượng lỗi. Sau khi triển khai điều đó, chúng tôi có thể khởi tạo một số lỗi cụ thể theo trường hợp để gửi thông báo mô tả nhiều hơn cho khách hàng của chúng tôi
Tất cả các lỗi đều rất rõ ràng và nhỏ, không có bất kỳ logic không cần thiết nào liên quan. Điều đó hợp lý vì chúng ta không muốn cho họ cơ hội thất bại một cách bất ngờ, phải không? Dù sao việc xác định các đối tượng lỗi chỉ là một nửa công việc Nối tiếp lỗi trong Ứng dụng RubyCách tiếp cận trên cho phép chúng tôi sử dụng một cái gì đó như
Để tuần tự hóa các phản hồi tiêu chuẩn, chúng tôi sử dụng đá quý fast_jsonapi từ Netflix. Nó khá tốt đối với cách tiếp cận thông thường, nhưng để xử lý lỗi không nhiều nên chúng tôi quyết định viết ErrorSerializer của riêng mình
logic rất đơn giản. Nó chấp nhận một đối tượng với các phương thức trạng thái, tiêu đề, chi tiết và nguồn, đồng thời tạo các phản hồi được tuần tự hóa ở định dạng
Vấn đề duy nhất ở đây là việc xử lý tất cả các lỗi đó trong mọi hành động của hệ thống sẽ dẫn đến rất nhiều bản sao mã không KHÔ lắm phải không? . RecordNotFound sẽ rất phức tạp. Sau đó, đây là những gì chúng tôi đã kết thúc trong API ApplicationController của mình
Chúng tôi chỉ bao gồm mô-đun ErrorHandler, nơi chúng tôi triển khai tất cả các ánh xạ và logic chịu trách nhiệm cho tất cả việc xử lý lỗi
Ở trên cùng, chúng tôi đã thêm một trình ánh xạ đẹp cho tất cả các lỗi mà chúng tôi dự kiến sẽ xảy ra ở đâu đó. Sau đó, chúng tôi giải cứu khỏi lỗi mặc định cho khối cứu hộ, đó là StandardError và gọi phương thức handle_error với đối tượng được nâng lên Bên trong phương pháp này, chúng tôi chỉ thực hiện ánh xạ lỗi tăng lên với những gì chúng tôi đã chuẩn bị phản hồi của máy chủ. Nếu không có cái nào phù hợp, chúng tôi sẽ quay lại Lỗi của mình. StandardError để khách hàng luôn nhận được thông báo lỗi đẹp trong phản hồi của máy chủ Chúng tôi cũng có thể thêm các trình thông báo bổ sung cho bất kỳ lỗi nào không được ánh xạ trong mô-đun trình xử lý, vì vậy quản trị viên ứng dụng sẽ có thể theo dõi các kết quả không mong muốn Lỗi gia tăng trong ứng dụngỞ Driggl, chúng tôi đã cố gắng tạo ra một giải pháp thống nhất để xử lý toàn bộ lỗi trên ứng dụng API của mình. Bằng cách này, chúng tôi có thể tăng lỗi của mình một cách rõ ràng mà không lặp lại bất kỳ khối cứu hộ nào và ApplicationController của chúng tôi sẽ luôn xử lý đúng cách
hoặc ________số 8Xử lý lỗi xác thựcChà, đó là một giải pháp hay, nhưng có một điều chúng tôi đã cố tình bỏ qua cho đến nay và đó là. lỗi xác thực Vấn đề với việc xác thực là chúng ta không thể viết đối tượng lỗi cho yêu cầu không hợp lệ giống như chúng ta đã làm cho phần còn lại, bởi vì
Điều này yêu cầu chúng tôi thêm một lỗi nữa, có tên là Không hợp lệ, đây là phiên bản mở rộng của những gì chúng tôi đã có trước đây
Bạn có thể thấy sự khác biệt chính ở đây là phương thức serialized_hash và phương thức khởi tạo. Phương thức khởi tạo cho phép chúng tôi chuyển hàm băm thông báo lỗi vào đối tượng lỗi của chúng tôi, vì vậy chúng tôi có thể tuần tự hóa chính xác lỗi cho từng thuộc tính và thông báo tương ứng ErrorSerializer của chúng tôi sẽ xử lý ngay lập tức, trả về 0Tuy nhiên, điều cuối cùng là tăng nó ở đâu đó, vì vậy trình xử lý sẽ lấy dữ liệu lỗi chính xác để tiếp tục Trong kiến trúc chúng ta có, đó không phải là vấn đề lớn. Sẽ thật khó chịu nếu chúng ta cập nhật và tạo các đối tượng như thế này 1Vì điều này sẽ buộc chúng tôi phải giải cứu ActiveRecord. Lỗi RecordInvalid trong mọi hành động và khởi tạo đối tượng lỗi tùy chỉnh của chúng tôi ở đó như thế này 2Điều này một lần nữa sẽ dẫn đến việc lặp lại rất nhiều khối giải cứu trên ứng dụng Tuy nhiên, ở Driggl, chúng tôi tận dụng kiến trúc Trailblazer, với các hợp đồng và hoạt động, cho phép chúng tôi dễ dàng thống nhất mọi hành động của bộ điều khiển trong hệ thống 3Tôi sẽ không đi sâu vào chi tiết của Trailblazer trong bài viết này, nhưng vấn đề là chúng tôi có thể xử lý các lỗi xác thực khi đã ở trong quá trình vận hành. định nghĩa phương thức và mọi thứ hoạt động như một nét duyên dáng trên toàn bộ ứng dụng, giữ cho mọi thứ vẫn đẹp và KHÔ 4Tóm lượcBạn có thể nghĩ rằng đó là rất nhiều mã, nhưng thực sự, đối với các ứng dụng lớn, nó chẳng là gì so với việc lặp lại nó trong hàng trăm bộ điều khiển và các tệp khác. Trong biểu mẫu này, chúng tôi đã quản lý để thống nhất tất cả các lỗi của mình trên toàn bộ ứng dụng API và chúng tôi không cần phải lo lắng nữa về các lỗi không mong muốn khi gửi tới ứng dụng khách Tôi hy vọng điều này cũng sẽ hữu ích cho bạn và nếu bạn tìm thấy bất kỳ cải tiến nào cho phương pháp này, vui lòng cho tôi biết trong phần nhận xét Các cách khác nhau để xử lý ngoại lệ là gì?Dưới đây là danh sách các cách tiếp cận khác nhau để xử lý ngoại lệ trong Java. . cố gắng. bắt khối cuối cùng chặn từ khóa ném và ném 3 khối được sử dụng để xử lý ngoại lệ là gì?Khối "catch" được sử dụng để xử lý ngoại lệ. Nó phải được đặt trước khối try, điều đó có nghĩa là chúng ta không thể sử dụng khối catch một mình. Nó có thể được theo sau bởi khối cuối cùng sau. Khối "cuối cùng" được sử dụng để thực thi mã cần thiết của chương trình. |