Grape RESTful API বানাতে একটি জনপ্রিয় রুবি ফ্রেমওয়ার্ক। যেকোনো অ্যাপ্লিকেশনের স্থিতিশীলতা এবং নির্ভরযোগ্যতা নিশ্চিত করতে এক্সেপশন হ্যান্ডলিং অত্যন্ত গুরুত্বপূর্ণ ভূমিকা পালন করে, Grape দিয়ে বने অ্যাপ্লিকেশনও ব্যতিক্রম নয়।
এই আর্টিকেলে আমরা Grape এক্সেপশন হ্যান্ডলিংয়ের বেসিকস অন্বেষণ করব, যার মধ্যে কাস্টম এক্সেপশন তৈরি করা। পাশাপাশি কিছু বেস্ট প্র্যাকটিস এবং AppSignal-এর সাথে ইন্টিগ্রেশন করে এনহান্সড এরর মনিটরিং ও ম্যানেজমেন্ট কীভাবে করা যায় সেটাও দেখব।
চলুন শুরু করি!
Grape এক্সেপশন হ্যান্ডলিংয়ের বেসিকস
এই টিউটোরিয়ালে আমরা দেখব রেলসে বিল্ট একটি Grape API-এ এক্সেপশন কীভাবে হ্যান্ডেল করতে হয়। আমি এই জন্য একটি ডেমো জব বোর্ড API বানিয়েছি, এবং সোর্স কোড GitHub-এ চেক আউট করতে পারেন।
এক্সেপশন রেইজ করা (Raising an Exception)
Grape-এ error! ব্যবহার করে এক্সেপশন রেইজ করা যায়। উদাহরণস্বরূপ, উপরে উল্লেখিত জব API-তে একটি show রাউট আছে যা ID ভিত্তিক জব রিটার্ন করে। রেকর্ড না পাওয়া গেলে 404 এরর রিটার্ন করতে পারি এইভাবে:
আপনি এক্সেপশন রেইজ করলে, সেটাকে একটি "ইউনিক" উপায়ে হ্যান্ডেল করতে চান—আপনার ইউজারদের রেইজড এক্সেপশন পাঠাতে চান না সাধারণত।
রুবিতে এক্সেপশন হ্যান্ডলিংয়ের একটি ডিফল্ট মেকানিজম আছে। এটা কাজ করে এমন কোডকে begin ব্লকে র্যাপ করে যেটা এক্সেপশন রেইজ করতে পারে। rescue ব্লক ব্যবহার করে রেইজড এক্সেপশন হ্যান্ডেল করা হয়।
তাহলে একটি টিপিক্যাল সিনেরিওতে সেটা নিচের মতো দেখাবে:
rescue_from মেথড
আপনি এক্সেপশন রেইজ করলেও বা আপনার সরাসরি ইনভলভমেন্ট ছাড়াই সেগুলো হয়ে গেলেও, সেগুলো ঠিকমতো হ্যান্ডেল করতে চান। ডিফল্টভাবে Grape একটি rescue_from মেথড প্রদান করে। এটি আপনাকে একটি কোড ব্লক নির্দিষ্ট করতে দেয় যা ডিফাইন করা এক্সেপশনগুলো রেইজ হলে এক্সিকিউট হয়।
তাহলে, jobs রিসোর্সে উত্থান করা 404 এরর বা অন্য যেকোনো এক্সেপশন "রেসকিউ" বা হ্যান্ডেল করতে rescue_from মেথড ব্যবহার করতে পারি। মেথডটি jobs রিসোর্সের উপরে যোগ করা হয়।
কন্টেন্ট টাইপও নির্দিষ্ট করা যায়:
এই পদ্ধতিতে এক্সেপশন হ্যান্ডেল করা খুব জেনেরিক—আমরা সব ধরনের এক্সেপশন রেসকিউ করছি এবং 404 স্ট্যাটাস কোড দিয়ে এরর রিটার্ন করছি। এটি মিসলিডিং যদি আমাদের API ইউজাররা 400 স্ট্যাটাস কোড এক্সপেক্ট করে।
বদলে আমরা নির্দিষ্ট এক্সেপশন নির্দিষ্ট করতে পারি:
যখন ActiveRecord::RecordNotFound এরর পাওয়া যায়, আমরা 404 স্ট্যাটাস কোড সহ এরর মেসেজ রিটার্ন করব। অন্যথায়, 500 স্ট্যাটাস কোড সহ এরর মেসেজ রিটার্ন করব।
এটি দেখাচ্ছে আমরা করেন্ট সিস্টেমকে উন্নত করতে পারি, কিন্তু যদি আমরা সকল এরর থেকে রেসকিউ করার একটি এরর হ্যান্ডলার চাই? সেটাই হলো এক্সেপশন কাস্টোমাইজেশনের কাজ।
রুবিতে Grape-এর জন্য এক্সেপশন কাস্টোমাইজ করা
এনকাউন্টার হওয়া এরর টাইপের উপর নির্ভর করে, এই এরর হ্যান্ডলারের সঠিক স্ট্যাটাস কোডের সাথে এরর মেসেজ রিটার্ন করতে হবে।
প্রথমে, exceptions_handler নামে একটি ফাইল তৈরি করুন। তারপর আমাদের বর্তমান এক্সেপশন হ্যান্ডলারগুলো সেখানে সরিয়ে আনুন:
আমাদের ExceptionHandler মডিউল ActiveSupport::Concern ব্যবহার করে, যা included এবং class_methods এর মত ফাংশনালিটি অ্যাক্সেস করতে দেয়। উপরের স্নিপেটে, এরর হ্যান্ডলারগুলো included ব্লকে আছে, তাই এই মডিউল যেখানে ইনক্লুড হবে, সেখানে সেগুলো যেনে ডিফাইন করা থাকবে।
আগে যেসব ফাইলে এরর হ্যান্ডলার ছিল সেগুলো থেকে সরিয়ে ফেলুন। তারপর ExceptionsHandler মডিউলটি আমাদের API এন্ট্রি ফাইলে—api.rb-এ ইনক্লুড করুন:
আমাদের এররগুলোর জন্য একটি বেস এরর ক্লাস তৈরি করি। এই ক্লাসটি এরর রেসপন্স রিটার্ন করার দায়িত্বে থাকবে।
এই ক্লাস দুটি কীওয়ার্ড প্যারামিটার নেয়: একটি message স্ট্রিং এবং একটি status। যদি কোনোটা পাস না করা হয়, ডিফল্ট ব্যবহার হবে।
body মেথডে, আমরা একটি Rack রেসপন্স রিটার্ন করি। ডিফল্টভাবে, rescue_from হ্যান্ডলারের অবশ্যই একটি Rack::Response অবজেক্ট রিটার্ন করতে হবে, error! কল করতে হবে, বা এক্সেপশন রেইজ করতে হবে।
এখন ExceptionsHandler-এ এটি ব্যবহার করি:
যখন আমরা /error এন্ডপয়েন্ট কল করব, তখন রেসপন্স হিসেবে oops দেখাবে। এই পর্যায়ে, আমরা NotFound এররোর জন্য একটি ক্লাস তৈরি করতে পারি।
NotFound ক্লাস শুধু message এক্সেপ্ট করে। যেহেতু এটি BaseError-এর থেকে ইনহেরিট করেছে, আমাদের আবার Rack::Response রিটার্ন করতে হবে না। এখন ExceptionsHandler-এ এটি এইভাবে ব্যবহার করি:
এখন, যদি আমরা ম্যানুয়ালি এমন এক্সেপশন রেইজ করতে চাই:
এটি ভালো কাজ করবে, কিন্তু স্ট্যাটাস কোড হবে 500, কারণ এটি BaseError ক্লাসের রেসপন্স রিটার্ন করে (যেহেতু BaseError ক্লাস এরর হ্যান্ডেল করে)। সেটা ফিক্স করতে, ExceptionHandler-কে মডিফাই করতে হবে যাতে স্পষ্টভাবে NotFound ক্লাস ব্যবহার করে এরর হ্যান্ডেল করে।
তাহলে, যখনই ActiveRecord::RecordNotFound এবং V1::Exceptions::NotFound এররответে এক্সেপশন এনকাউন্টার হবে, Exceptions::NotFound ব্যবহার করবে। অন্যথায়, Exceptions::BaseError ব্যবহার করবে।
আপনি দেখছেন, যতগুনো এরর ক্লাস তৈরি করব, ততগুনো স্পেসিফিক rescue_from ব্লক লাগবে। আমরা কেস স্টেটমেন্ট ব্যবহার করে এটি উন্নত করতে পারি:
Et voilà!
বেস্ট প্র্যাকটিস এবং টিপস
এক্সেপশন হ্যান্ডলিংয়ের জন্য అనেক বেস্ট প্র্যাকটিস আছে, এখানে কিছু কুইক টিপস দেওয়া হলো:
- সম্পর্কিত এক্সেপশনগুলো গ্রুপ করুন: উপরের কোডে দেখানো মতে, সম্পর্কিত এক্সেপশন গ্রুপ করলে মেইনটেইনেবল কোড পাওয়া যায়। এক্সেপশন হ্যান্ডেল করার সংখ্যা বড়ার সাথে সাথে, সেগুলো আমাদের লিস্টে যোগ করতে পারি।
error!এর মত হেল্পার ব্যবহার করে দ্রুত এক্সেপশন রেইজ করুন। এটি আপনার এক্সেপশন হ্যান্ডলিং সহজ করে দেয়।- AppSignal এর মত এক্সেপশন মনিটরিং টুল ব্যবহার করুন।
AppSignal ইন্টিগ্রেশন: রুবির জন্য Grape
AppSignal আপনার অ্যাপ্লিকেশনের এরর মনিটর ও ট্র্যাক করতে সাহায্য করে। Grape API-র সাথে AppSignal ইন্টিগ্রেট করলে এক্সেপশনগুলোর মূল্যবান ইনসাইট পাওয়া যায়। এই গাইড দেখিয়ে দিচ্ছে কীভাবে Grape API-র সাথে AppSignal ইন্টিগ্রেট করতে হয়। আপনার API-তে যেকোনো এরর হলে, সেটা আপনার AppSignal ড্যাশবোর্ডে দেখাবে, নিচের মতো:

শেষ কথা
এক্সেপশন হ্যান্ডলিং রবাস্ট API ডেভেলপমেন্টের একটি ক্রিটিক্যাল দিক। এই টিউটোরিয়ালে আমরা দেখেছি Grape API-এ এক্সেপশন ঠিকমতো কীভাবে হ্যান্ডেল করতে হয়। আমরা কিছু বেস্ট প্র্যাকটিস এবং Grape-এর জন্য AppSignal ইন্টিগ্রেশনে সংক্ষিপ্তভাবে চर्चা করেছি।
এক্সেপশন হ্যান্ডলিং একটি চলমান প্রক্রিয়া—এটাকে কনসিস্টেন্টলি উন্নত করতে হবে।
হ্যাপি কোডিং!
P.S. রুবি ম্যাজিক পোস্টগুলো প্রেস থেকে বের होते সাথে পেতে চাইলে আমাদের রুবি ম্যাজিক নিউজলেটার সাবস্ক্রাইব করুন এবং একটিও পোস্ট মিস করবেন না!
P.P.S. আপনি কি জানেন AppSignal-এর Active Record ইন্টিগ্রেশন আছে? আরো জানুন।