अपवाद प्रबंधन
कॉन्फ़िगरेशन
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
अपवाद का उपयोग करने पर विचार करना चाहिए।