PHP में एरर हैंडलिंग: try/catch से प्रोडक्शन-रेडी समाधान तक
\n\nहर PHP डेवलपर को एरर का सामना करना पड़ता है। बेसिक try/catch तो बस शुरुआत है। इस आर्टिकल में हम एरर हैंडलिंग की एडवांस्ड तकनीकों को समझेंगे, जो आपके कोड को मजबूत और विश्वसनीय बनाएंगी, ताकि वह किसी भी खराबी पर सही ढंग से रिएक्ट कर सके।
1. try/catch में गहराई से उतरना: finally ब्लॉक और एकाधिक catch
\n\nस्टैंडर्ड try/catch तो बेस है, लेकिन कई लोग finally ब्लॉक को भूल जाते हैं, जो हमेशा एक्सीक्यूट होता है, चाहे एक्सेप्शन हुआ हो या नहीं। यह रिसोर्सेज (फाइलें, DB कनेक्शन) को बंद करने के लिए परफेक्ट जगह है।
<?php\nfunction processFile(string $filename): void {\n $handle = fopen($filename, 'r');\n if (!$handle) {\n throw new \\RuntimeException("फ़ाइल खोलने में विफल: $filename");\n }\n \n try {\n // फ़ाइल प्रोसेसिंग\n while (($line = fgets($handle)) !== false) {\n // ... प्रोसेसिंग लॉजिक\n }\n } catch (\\RuntimeException $e) {\n // इनपुट-आउटपुट एरर की विशिष्ट हैंडलिंग\n error_log("फ़ाइल पढ़ने में त्रुटि: " . $e->getMessage());\n throw $e; // ऊपर भेजें\n } catch (\\Exception $e) {\n // अन्य सभी एक्सेप्शन की हैंडलिंग\n error_log("अज्ञात त्रुटि: " . $e->getMessage());\n throw $e;\n } finally {\n fclose($handle); // हमेशा फ़ाइल बंद करें\n }\n}\n?>\n\nमहत्वपूर्ण: catch ब्लॉक का क्रम मायने रखता है। अधिक विशिष्ट एक्सेप्शन (जैसे \\RuntimeException) को सामान्य (\\Exception) से पहले रखें। नहीं तो विशिष्ट ब्लॉक कभी एक्सीक्यूट नहीं होगा।
2. कस्टम एक्सेप्शन क्लासेज: सिमैंटिक्स और पदानुक्रम
\n\nबिल्ट-इन एक्सेप्शन (PDOException, RuntimeException) अक्सर पर्याप्त जानकारीपूर्ण नहीं होते। अपनी खुद की एक्सेप्शन हायरार्की बनाएं, ताकि एरर को टाइप के अनुसार अलग कर सकें और उनकी हैंडलिंग आसान हो।
\n\n<?php\n// एप्लिकेशन का बेस एक्सेप्शन\nclass AppException extends \\Exception {}\n\n// वैलिडेशन एरर\nclass ValidationException extends AppException {\n private array $errors;\n \n public function __construct(array $errors, string $message = "वैलिडेशन त्रुटि") {\n parent::__construct($message, 422);\n $this->errors = $errors;\n }\n \n public function getErrors(): array {\n return $this->errors;\n }\n}\n\n// एक्सेस एरर\nclass AccessDeniedException extends AppException {\n public function __construct(string $message = "पहुंच अस्वीकृत") {\n parent::__construct($message, 403);\n }\n}\n\n// उपयोग का उदाहरण\nfunction registerUser(array $data): void {\n $errors = [];\n \n if (empty($data['email'])) {\n $errors['email'] = 'ईमेल आवश्यक है';\n }\n if (empty($data['password'])) {\n $errors['password'] = 'पासवर्ड आवश्यक है';\n }\n \n if (!empty($errors)) {\n throw new ValidationException($errors);\n }\n \n // रजिस्ट्रेशन लॉजिक...\n}\n\ntry {\n registerUser(['email' => '']);\n} catch (ValidationException $e) {\n // विशिष्ट हैंडलिंग: एरर के साथ JSON लौटाएं\n http_response_code(422);\n echo json_encode(['errors' => $e->getErrors()]);\n} catch (AccessDeniedException $e) {\n http_response_code(403);\n echo json_encode(['error' => $e->getMessage()]);\n} catch (AppException $e) {\n // बाकी सभी एप्लिकेशन एरर के लिए सामान्य हैंडलिंग\n http_response_code(500);\n echo json_encode(['error' => 'सर्वर में आंतरिक त्रुटि']);\n}\n?>\n\nसुझाव: HTTP कोड (400, 403, 422, 500) को एक्सेप्शन कोड के रूप में उपयोग करें — इससे REST API के साथ इंटीग्रेशन आसान हो जाता है।
\n\n3. ग्लोबल एरर हैंडलर: ErrorHandler और ShutdownHandler
\n\nसभी एरर को try/catch से नहीं पकड़ा जा सकता। फैटल एरर (E_ERROR), वॉर्निंग (E_WARNING) और पार्सिंग एरर