Grape là một framework Ruby phổ biến để xây dựng các API RESTful. Xử lý ngoại lệ đóng một vai trò quan trọng trong việc đảm bảo tính ổn định và độ tin cậy của bất kỳ ứng dụng nào, kể cả những ứng dụng được tạo bằng Grape.
Bài viết này sẽ khám phá những kiến thức cơ bản về xử lý ngoại lệ của Grape, bao gồm cả việc tùy chỉnh các ngoại lệ. Chúng tôi cũng sẽ đề cập đến một số phương pháp hay nhất và cách tích hợp ứng dụng của bạn với AppSignal để quản lý và giám sát lỗi nâng cao.
Hãy bắt đầu!
Cơ bản về xử lý ngoại lệ nho
Trong hướng dẫn này, chúng ta sẽ xem cách xử lý các trường hợp ngoại lệ trong API Grape được tích hợp trong Rails. Tôi đã tạo API bảng công việc demo cho việc này và bạn có thể xem mã nguồn trên GitHub.
Đưa ra ngoại lệ
Bạn có thể đưa ra một ngoại lệ trong Grape bằng cách sử dụng error! . Ví dụ:trong API công việc được đề cập ở trên, chúng tôi có show tuyến đường trả về một công việc dựa trên ID . Chúng tôi có thể trả về 404 lỗi khi không có bản ghi, như thế này:
Khi đưa ra một ngoại lệ, bạn sẽ muốn xử lý nó theo cách "duy nhất" — rất có thể bạn sẽ không muốn gửi ngoại lệ được nêu ra cho người dùng của mình.
Trong Ruby, chúng ta có cơ chế mặc định để xử lý ngoại lệ. Nó hoạt động bằng cách gói mã có thể gây ra ngoại lệ trong begin khối. rescue khối được sử dụng để xử lý ngoại lệ đã được nêu ra.
Vì vậy, đây là giao diện trong trường hợp điển hình:
rescue_from Phương pháp
Khi bạn đưa ra các trường hợp ngoại lệ hoặc khi chúng xảy ra mà không có sự tham gia trực tiếp của bạn, bạn sẽ muốn xử lý chúng đúng cách. Theo mặc định, Grape cung cấp rescue_from phương pháp. Điều này cho phép bạn chỉ định một khối mã sẽ được thực thi khi các ngoại lệ được xác định được đưa ra.
Vì vậy, để “cứu” hoặc xử lý 404 lỗi chúng tôi đã nêu trước bất kỳ lỗi nào khác phát sinh trong jobs tài nguyên, chúng ta có thể sử dụng rescue_from phương pháp. Phương thức này được thêm vào phía trên jobs tài nguyên.
Chúng tôi cũng có thể chỉ định loại nội dung sẽ được sử dụng:
Cách xử lý ngoại lệ này quá chung chung — chúng tôi đang giải cứu mọi dạng ngoại lệ và trả về lỗi bằng 404 mã trạng thái. Điều đó sẽ gây hiểu lầm nếu người dùng API của chúng tôi mong muốn nhận được 400 mã trạng thái.
Thay vào đó, chúng ta có thể chỉ định ngoại lệ mà chúng ta muốn xử lý:
Khi chúng tôi gặp phải ActiveRecord::RecordNotFound lỗi, chúng tôi sẽ trả về thông báo lỗi có 404 mã trạng thái. Nếu không, chúng tôi sẽ trả về thông báo lỗi có 500 mã trạng thái.
Điều này cho thấy rằng chúng tôi có thể cải thiện những gì chúng tôi hiện có, nhưng điều gì sẽ xảy ra nếu chúng tôi muốn một trình xử lý lỗi có thể giải cứu tất cả lỗi? Đó là lúc việc tùy chỉnh các ngoại lệ xuất hiện.
Tùy chỉnh ngoại lệ trong Grape cho Ruby
Tùy thuộc vào loại lỗi gặp phải, trình xử lý lỗi này có thể trả về thông báo lỗi cùng với mã trạng thái chính xác.
Đầu tiên, tạo một tệp có tên Exceptions_handler . Sau đó, chúng tôi sẽ chuyển các trình xử lý ngoại lệ hiện tại vào tệp:
ExceptionHandler của chúng tôi mô-đun sử dụng ActiveSupport::Concern , cho phép chúng tôi truy cập các chức năng như included và class_methods . Trong đoạn mã trên, chúng ta có trình xử lý lỗi trong included khối, do đó, bất cứ khi nào mô-đun này được đưa vào, chúng sẽ có sẵn như được xác định.
Chúng ta có thể tiếp tục và xóa trình xử lý lỗi khỏi các tệp mà chúng ta đã có trước đó. Sau đó, chúng ta có thể bao gồm ExceptionsHandler mô-đun trong tệp mục nhập API của chúng tôi — api.rb :
Hãy tạo một lớp lỗi cơ bản cho các lỗi của chúng ta. Lớp này sẽ chịu trách nhiệm trả về phản hồi lỗi.
Lớp chấp nhận hai tham số từ khóa:a message chuỗi và một status . Nếu không có kết quả nào được thông qua, chúng tôi sẽ sử dụng giá trị mặc định.
Trong body phương thức này, chúng tôi trả về phản hồi Rack. Theo mặc định, rescue_from trình xử lý phải trả về Rack::Response đối tượng, hãy gọi error! , hoặc đưa ra một ngoại lệ.
Chúng ta có thể tiếp tục và sử dụng nó trong ExceptionsHandler :
Khi chúng ta gọi /error điểm cuối, chúng ta sẽ thấy oops được trả lại như phản hồi. Tại thời điểm này, chúng ta có thể tạo một lớp cho NotFound lỗi.
NotFound lớp chỉ chấp nhận message . Vì nó kế thừa từ BaseError , chúng tôi không cần trả về Rack::Response một lần nữa. Chúng ta có thể tiếp tục và sử dụng nó trong ExceptionsHandler như thế này:
Bây giờ, nếu chúng ta cố gắng đưa ra lỗi như thế này theo cách thủ công:
Điều này sẽ hoạt động tốt, nhưng mã trạng thái sẽ là 500 , vì nó trả về phản hồi trong BaseError lớp (dưới dạng BaseError lớp xử lý lỗi). Để khắc phục điều đó, chúng ta cần sửa đổi ExceptionHandler để sử dụng rõ ràng NotFound class để xử lý lỗi thay thế.
Vì vậy, mỗi khi xảy ra lỗi tương ứng với ActiveRecord::RecordNotFound và V1::Exceptions::NotFound gặp phải, hãy sử dụng Exceptions::NotFound . Nếu không, hãy sử dụng Exceptions::BaseError .
Bạn có thể thấy rằng chúng tôi sẽ cần cụ thểrescue_from chặn khi chúng tôi tạo ra nhiều lớp lỗi hơn. Chúng tôi có thể cải thiện điều này bằng cách sử dụng các câu lệnh tình huống:
Và thì đấy!
Các mẹo và phương pháp hay nhất
Mặc dù có rất nhiều phương pháp hay nhất mà bạn có thể áp dụng để xử lý ngoại lệ nhưng dưới đây là một số mẹo nhanh để bạn làm theo:
- Các ngoại lệ liên quan đến nhóm:Như chúng ta đã thấy trong đoạn mã trên, việc nhóm các ngoại lệ liên quan đến nhóm cho phép chúng ta có mã có thể duy trì được. Khi số lượng trường hợp ngoại lệ mà chúng tôi muốn xử lý tăng lên, chúng tôi có thể thêm chúng vào danh sách của mình.
- Sử dụng các trợ giúp như
error!để nhanh chóng đưa ra các ngoại lệ. Điều này giúp đơn giản hóa việc xử lý ngoại lệ của bạn. - Tận dụng các công cụ giám sát ngoại lệ như AppSignal.
Tích hợp AppSignal:Grape cho Ruby
AppSignal giúp bạn giám sát và theo dõi lỗi trong ứng dụng của mình. Việc tích hợp AppSignal với API Grape của bạn sẽ mang lại cho bạn thông tin chi tiết có giá trị về các trường hợp ngoại lệ. Hướng dẫn này chỉ cho bạn cách tích hợp AppSignal với API Grape của bạn. Bất cứ khi nào xảy ra lỗi trong API của bạn, bạn sẽ thấy lỗi đó trong trang tổng quan AppSignal của mình, như vậy:

Kết thúc
Xử lý ngoại lệ là một khía cạnh quan trọng của việc phát triển các API mạnh mẽ. Trong hướng dẫn này, chúng ta đã biết cách xử lý đúng cách các trường hợp ngoại lệ trong API Grape. Chúng tôi cũng đã xem xét ngắn gọn một số phương pháp hay nhất và khả năng tích hợp của AppSignal cho Grape.
Xử lý ngoại lệ là một quá trình diễn ra liên tục — bạn sẽ cần phải cải thiện một cách nhất quán.
Chúc bạn viết mã vui vẻ!
Tái bút. Nếu bạn muốn đọc các bài đăng của Ruby Magic ngay khi chúng được đăng tải, hãy đăng ký nhận bản tin Ruby Magic của chúng tôi và không bao giờ bỏ lỡ một bài đăng nào!
P.P.S. Bạn có biết rằng AppSignal cung cấp tích hợp Active Record không? Tìm hiểu thêm.