ব্যতিক্রম পরিচালনা

কনফিগারেশন

config/exception.php

return [
    // এখানে ব্যতিক্রম পরিচালনার ক্লাস কনফিগার করুন
    '' => support\exception\Handler::class,
];

মাল্টি অ্যাপ মোডে, আপনি প্রতিটি অ্যাপের জন্য আলাদাভাবে ব্যতিক্রম পরিচালনার ক্লাস কনফিগার করতে পারেন, মাল্টি অ্যাপ দেখুন।

ডিফল্ট ব্যতিক্রম পরিচালনা ক্লাস

webman এ ব্যতিক্রম ডিফল্টভাবে support\exception\Handler ক্লাস দ্বারা পরিচালিত হয়। ডিফল্ট ব্যতিক্রম পরিচালনা ক্লাস পরিবর্তন করতে config/exception.php কনফিগারেশন ফাইলটি পরিবর্তন করা যেতে পারে। ব্যতিক্রম পরিচালনা ক্লাসটি Webman\Exception\ExceptionHandlerInterface ইন্টারফেসটি বাস্তবায়ন করতে হবে।

interface ExceptionHandlerInterface
{
    /**
     * লগ রেকর্ড করুন
     * @param Throwable $e
     * @return mixed
     */
    public function report(Throwable $e);

    /**
     * রেন্ডার রিটার্ন
     * @param Request $request
     * @param Throwable $e
     * @return Response
     */
    public function render(Request $request, Throwable $e) : Response;
}

রেন্ডার প্রতিক্রিয়া

ব্যতিক্রম পরিচালনা ক্লাসের render পদ্ধতি প্রতিক্রিয়া রেন্ডার করার জন্য ব্যবহৃত হয়।

যদি কনফিগারেশন ফাইল config/app.phpdebug মানটি true হয় (নীচের নাম app.debug=true), তবে বিস্তারিত ব্যতিক্রমের তথ্য ফিরে আসবে, অন্যথায় সংক্ষিপ্ত ব্যতিক্রমের তথ্য ফিরে আসবে।

যদি অনুরোধটি json প্রাপ্তির প্রত্যাশা করে, তবে ফেরত দেওয়া ব্যতিক্রমের তথ্য json ফরম্যাটে ফিরে আসবে, যেমন

{
    "code": "500",
    "msg": "ব্যতিক্রম তথ্য"
}

যদি app.debug=true হয়, json ডেটাতে অতিরিক্ত একটি trace ক্ষেত্র থাকবে বিস্তারিত কল স্ট্যাক ফেরত দেওয়ার জন্য।

আপনি ডিফল্ট ব্যতিক্রম পরিচালনার যৌক্তিকতা পরিবর্তন করতে আপনার নিজের ব্যতিক্রম পরিচালনা ক্লাস তৈরি করতে পারেন।

ব্যবসায়িক ব্যতিক্রম BusinessException

কখনও কখনও আমরা চাই যে কোনও আবদ্ধ ফাংশনে অনুরোধটি বন্ধ করে ক্লায়েন্টের কাছে একটি ত্রুটি বার্তা ফেরত দেওয়া হোক, এই সময় BusinessException নিক্ষেপের মাধ্যমে এটি করা যেতে পারে।
যেমন:

<?php
namespace app\controller;

use support\Request;
use support\exception\BusinessException;

class FooController
{
    public function index(Request $request)
    {
        $this->chackInpout($request->post());
        return response('hello index');
    }

    protected function chackInpout($input)
    {
        if (!isset($input['token'])) {
            throw new BusinessException('প্যারামিটার ত্রুটি', 3000);
        }
    }
}

উপরের উদাহরণ একটি ফেরত দেবে

{"code": 3000, "msg": "প্যারামিটার ত্রুটি"}

সতর্কতা
ব্যবসায়িক ব্যতিক্রম BusinessException-এর জন্য ব্যবসায়িক try ধরে রাখার প্রয়োজন নেই, ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে এটিকে ধরে নেবে এবং অনুরোধের ধরন অনুযায়ী উপযুক্ত আউটপুট ফেরত দেবে।

কাস্টম ব্যবসায়িক ব্যতিক্রম

যদি উপরোক্ত প্রতিক্রিয়া আপনার প্রয়োজন অনুযায়ী না হয়, যেমন msg পরিবর্তন করে message রাখতে চান, তবে একটি কাস্টম MyBusinessException তৈরি করতে পারেন।

নতুন একটি তৈরি করুন app/exception/MyBusinessException.php এবং নিম্নলিখিত বিষয়বস্তু লিখুন:

<?php

namespace app\exception;

use support\exception\BusinessException;
use Webman\Http\Request;
use Webman\Http\Response;

class MyBusinessException extends BusinessException
{
    public function render(Request $request): ?Response
    {
        // json অনুরোধ json ডেটা ফেরত দেয়
        if ($request->expectsJson()) {
            return json(['code' => $this->getCode() ?: 500, 'message' => $this->getMessage()]);
        }
        // non-json অনুরোধে একটি পৃষ্ঠা ফেরত দেয়
        return new Response(200, [], $this->getMessage());
    }
}

এভাবে যখন ব্যবসায়িক কল হয়

use app\exception\MyBusinessException;

throw new MyBusinessException('প্যারামিটার ত্রুটি', 3000);

json অনুরোধটি একটি এর মতো json ফেরত পাবে

{"code": 3000, "message": "প্যারামিটার ত্রুটি"}

টিপ
যেহেতু BusinessException ব্যতিক্রম ব্যবসায়িক ব্যতিক্রমের অন্তর্ভুক্ত (যেমন ব্যবহারকারী ইনপুট প্যারামিটার ত্রুটি), এটি পূর্বানুমানযোগ্য, তাই ফ্রেমওয়ার্ক এটিকে মরণাত্মক ত্রুটি মনে করে না এবং লগ রেকর্ড করে না।

সারসংক্ষেপ

যখনই বর্তমান অনুরোধ বন্ধ করে ক্লায়েন্টের কাছে তথ্য ফেরত দেওয়ার প্রয়োজন হয়, তখন BusinessException ব্যতিক্রম ব্যবহারের কথা ভাবতে পারেন।