अपवाद प्रबंधन

कॉन्फ़िगरेशन

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.php में debug मान 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()]);
        }
        // गैर-json अनुरोध पर एक पृष्ठ लौटाता है
        return new Response(200, [], $this->getMessage());
    }
}

इस प्रकार जब व्यावसायिक कॉल

use app\exception\MyBusinessException;

throw new MyBusinessException('पैरामिटर त्रुटि', 3000);

json अनुरोध एक समान json प्रतिक्रिया प्राप्त करेगा

{"code": 3000, "message": "पैरामिटर त्रुटि"}

संकेत
चूंकि BusinessException अपवाद व्यवसायिक अपवाद (जैसे उपयोगकर्ता द्वारा इनपुट पैरामीटर की त्रुटि) हैं, ये पूर्वानुमानित होते हैं, इसलिए फ्रेमवर्क इसे कथित गंभीर त्रुटि नहीं मानता और लॉग नहीं रिकॉर्ड करेगा।

सारांश

किसी भी स्थान पर जहाँ आप वर्तमान अनुरोध को रोकना और ग्राहक को जानकारी लौटाना चाहते हैं, आपको BusinessException अपवाद का उपयोग करने पर विचार करना चाहिए।