লারাভেল: এক্সেপশন হ্যান্ডলিং | Laravel: Exception Handling সিস্টেমের সহজ ব্যাখ্যা | Bonus Topic of Part 9
হ্যালো আবার! আজকে আমরা লারাভেলে এক্সেপশন হ্যান্ডলিং ( Laravel: Exception Handling ) নিয়ে আলোচনা করব। প্রোগ্রামিংয়ের দুনিয়াতে কোনও না কোনওভাবে এরর বা এক্সেপশন ঘটাটাই স্বাভাবিক। অ্যাপ্লিকেশনগুলোতে বিভিন্ন রকম এরর ঘটতে পারে — ডাটাবেজ কানেকশন সমস্যা, ফাইল না পাওয়া, ইনভ্যালিড ইনপুট ইত্যাদি। যদি আপনি এগুলো ঠিকমতো হ্যান্ডেল না করেন, তাহলে আপনার অ্যাপের পারফরম্যান্স খারাপ হবে এবং ইউজাররাও হতাশ হয়ে পড়বে।
তাই লারাভেল এটিকে খুবই গুরুত্ব দিয়েছে। তারা একটি Built-in Exception Handler দিয়েছে যা আপনাকে এরর ও এক্সেপশনগুলো সহজেই ম্যানেজ করতে দেয়।
লারাভেলের বিল্ট-ইন এক্সেপশন হ্যান্ডলিং
যখনই কোনও এক্সেপশন বা এরর ঘটে, লারাভেল সেটিকে তার Exception Handler এ পাঠায়। এই হ্যান্ডলার দেখে যে এক্সেপশনটি কি ধরনের এবং তারপরে সেটিকে কীভাবে হ্যান্ডেল করা যায়। এছাড়াও এটি লগ ফাইলেও এক্সেপশনটির রেকর্ড রাখে।
এটি ডিফল্টভাবে একটি সাধারণ এরর পেজ দেখায়। যেখানে এক্সেপশন বা এরর মেসেজটি, এক্সেপশনের ধরন এবং কোনও স্ট্যাক ট্রেস থাকলে সেটিও দেখায়।
কিন্তু এটি শুধু প্রোডাকশন এনভায়রনমেন্টের জন্যই। যদি আপনি লোকাল এনভায়রনমেন্টে থাকেন, তাহলে লারাভেল আপনাকে এরর পেজের পরিবর্তে একটি ডিটেলড এক্সেপশন দেখাবে বা একটি ডিবাগার কল করবে।
একটু উদাহরণ দেখা যাক
ধরুন আমরা একটি ফাইল ওপেন করার চেষ্টা করছি যেটি মৌজুদ নেই:
$file = fopen('missing.txt', 'r');
এই লাইনটি একটি FileNotFoundException
এক্সেপশন তৈরি করবে। আর লারাভেল প্রোডাকশন মোডে থাকলে একটি এরর পেজ দেখাবে আর লোকাল মোডে থাকলে একটি ভাস্কারী দিবে।
যদি আপনি চান আপনিই এটি নিজে হ্যান্ডেল করবেন তাহলে আপনাকে শুধু app/Exceptions/Handler.php
ফাইলটিতে যেতে হবে। এই ক্লাসের render
মেথডে আপনি একটি Switch-case ব্লক পাবেন যেখানে বিভিন্ন এক্সেপশনগুলো হ্যান্ডেল করা হচ্ছে।
উদাহরণস্বরূপ, আমরা যদি FileNotFoundException
এক্সেপশনটি আলাদাভাবে হ্যান্ডেল করতে চাই, তাহলে লিখতে পারি:
public function render($request, Exception $e)
{
if ($e instanceof FileNotFoundException) {
return response()->view('errors.file-not-found', [], 500);
}
return parent::render($request, $e);
}
এখানে, যদি এক্সেপশনটি FileNotFoundException
হয়, তাহলে আমরা একটি কাস্টম file-not-found
ভিউ দেখাব এবং ৫০০ স্ট্যাটাস কোড রিটার্ন করব। অন্যথায় লারাভেল ডিফল্ট ভিউটিই দেখাবে।
আপনার নিজস্ব এক্সেপশন ক্লাস তৈরি করা
লারাভেল আপনাকে আপনার অ্যাপের জন্য নিজস্ব এক্সেপশন ক্লাসও তৈরি করার সুযোগ দিয়েছে। এতে করে আপনি আরও কাস্টমাইজড এরর হ্যান্ডলিং করতে পারবেন।
ধরুন আমরা একটি OverdraftException
তৈরি করতে চাই যেটা হবে যখন কোনও ব্যাংক অ্যাকাউন্টে যথেষ্ট টাকা না থাকবে। এটি করতে, আমরা টারমিনালে এই কমান্ডটি লিখব:
php artisan make:exception OverdraftException
এতে করে app/Exceptions
ডিরেক্টরিতে OverdraftException.php
ফাইলটি তৈরি হবে। এখানে আমরা বিভিন্ন মেথড অভাররাইড করে আমাদের ইচ্ছামত কাজ করতে পারব।
উদাহরণস্বরূপ, আমরা render
মেথডটি অভাররাইড করে একটা কাস্টম রেসপন্স রিটার্ন করতে পারি:
public function render($request)
{
return response()->view('errors.overdraft', [], 403);
}
এখানে আমরা একটি overdraft.blade.php
ভিউ দেখাব এবং ৪০৩ (ফরবিডেন) স্ট্যাটাস কোড রিটার্ন করব।
এরপর আমরা app/Exceptions/Handler.php
ফাইলে গিয়ে এই এক্সেপশনটিকে রেজিস্টার করতে পারি:
public function render($request, Exception $e)
{
if ($e instanceof OverdraftException) {
return $e->render($request);
}
return parent::render($request, $e);
}
এভাবে, যখনই OverdraftException
ঘটবে, আমরা আমাদের কাস্টম লজিক রান করাব এবং একটি কাস্টম এরর পেজ দেখাব।
লগিং এবং এরর ইভেন্ট লিসেনার
লারাভেল আপনাকে এরর লগিং এবং ইভেন্ট লিসেনারও যোগ করার সুযোগ দিয়েছে। এতে করে আপনি বিভিন্ন এক্সেপশন ঘটলে কিছু কাজ করতে পারবেন।
প্রথমেই আসা যাক লগিং এর কথায়। লারাভেল সব এক্সেপশনকে ডিফল্টভাবে লগ ফাইলে রাখে। কিন্তু আপনি চাইলে আপনার মতো করে লগ করতে পারেন। app/Exceptions/Handler.php
ফাইলে একটি report
মেথড আছে যেখানে আপনি এটি করতে পারেন।
public function report(Exception $e)
{
if ($e instanceof \OverdraftException) {
// লগ করার কোড এখানে লিখতে পারেন
}
parent::report($e);
}
এখানে আপনি যেকোনও লগিং লাইব্রেরি ব্যবহার করে লগ করতে পারেন বা অন্য যেকোনও কাজ করতে পারেন।
এবার আসা যাক ইভেন্টের কথায়। লারাভেল যখন কোনও এক্সেপশন ধরে তখন সেটি Illuminate\Foundation\Http\Events\RequestHandled
ইভেন্টটি রিজোল্ভ করে। আপনি এই ইভেন্টের একটি লিসেনার তৈরি করে বিভিন্ন কাজ করতে পারেন।
ধরুন আমরা একটি মেইল পাঠাতে চাই যখনই কোনও অথেনটিকেশন এক্সেপশন ঘটবে। এজন্য আমরা প্রথমে একটি লিসেনার ক্লাস তৈরি করব:
php artisan make:listener SendAuthExceptionMail --event=Illuminate\Foundation\Http\Events\RequestHandled
এতে করে app/Listeners/SendAuthExceptionMail.php
ফাইলটি তৈরি হবে। এখানে আমরা handle
মেথডটি ওভাররাইড করব:
public function handle(RequestHandled $event)
{
if ($event->request->exception instanceof AuthenticationException) {
Mail::to('admin@example.com')->send(new AuthExceptionMail());
}
}
এখানে আমরা একটি AuthExceptionMail
মেইল ক্লাস তৈরি করেছি যেটি এডমিনকে একটি মেইল পাঠাবে যখনই কোনও অথেনটিকেশন এক্সেপশন ঘটবে।
এরপর আমাদের শুধু এই লিসেনারটি EventServiceProvider
এ রেজিস্টার করতে হবে:
protected $listen = [
RequestHandled::class => [
SendAuthExceptionMail::class,
],
];
এইভাবে লারাভেলের বিল্ট-ইন এক্সেপশন হ্যান্ডলিং সিস্টেমে আপনি আপনার ইচ্ছামত লজিক যোগ করতে পারেন।
সারাংশ
সুতরাং বন্ধুরা, আজকে আমরা লারাভেলের এক্সেপশন হ্যান্ডলিং সিস্টেমটি খুব সহজেই বুঝে নিয়েছি। লারাভেল একটি শক্তিশালী বিল্ট-ইন ह্যান্ডলার দিয়েছে যা ডিফল্টভাবে সব এক্সেপশন হ্যান্ডেল করে। আপনি চাইলে কাস্টম এক্সেপশন ক্লাসও তৈরি করতে পারেন এবং নিজের মতো করে হ্যান্ডেল করতে পারেন। এছাড়াও লগিং এবং ইভেন্ট লিসেনারের মাধ্যমে আপনি অতিরিক্ত লজিক যোগ করতে পারেন। এসব ফিচারগুলো আপনাকে আপনার অ্যাপের এরর হ্যান্ডলিং অনেক সহজ এবং কাস্টমাইজড করতে সাহায্য করবে। সুতরাং এখনই চোখ বুজে ভরসা করুন এই Exception Handling সিস্টেমটির ওপর। এবং বুঝে নিন কীভাবে এটি আপনার অ্যাপকে আরও নির্ভরযোগ্য করে তুলবে।