परिचय
try-catch ब्लॉक्स को किसी भी वांछित स्तर तक नेस्ट किया जा सकता है। एक्सेप्शन्स को उपस्थिति के रिवर्स ऑर्डर में हैंडल किया जाता है यानी इनरमोस्ट एक्सेप्शन प्रोसेसिंग पहले की जाती है।
उदाहरण: नेस्टेड try-catch
निम्न उदाहरण में, इनर try ब्लॉक चेक करता है कि क्या दो वेरिएबल्स में से कोई नॉन-न्यूमेरिक है, और यदि हां, तो यूजर-डिफाइंड एक्सेप्शन फेंकता है। आउटर try ब्लॉक DivisionByZeroError फेंकता है यदि डिनोमिनेटर 0 है। अन्यथा दो नंबरों का विभाजन प्रदर्शित होता है।
<?php
class myException extends Exception {
function message() {
return "error: " . $this->getMessage() . " in line no " . $this->getLine();
}
}
$x = 10;
$y = 0;
try {
if (is_numeric($x) == FALSE || is_numeric($y) == FALSE) {
throw new myException("Non numeric data");
}
} catch (myException $m) {
echo $m->message();
return;
}
if ($y == 0) {
throw new DivisionByZeroError("Division by 0");
}
echo $x / $y;
} catch (DivisionByZeroError $e) {
echo $e->getMessage() . " in line no " . $e->getLine();
}
?>
आउटपुट (y=0 के साथ)
Division by 0 in line no 19
आउटपुट (किसी एक वेरिएबल को नॉन-न्यूमेरिक बनाने पर)
error: Non numeric data in line no 20
आउटपुट (यदि दोनों वेरिएबल्स नंबर हैं)
उनका विभाजन प्रिंट होता है।
मुख्य बिंदु
- नेस्टेड try-catch ब्लॉक्स इनर-टू-आउटर ऑर्डर में निष्पादित होते हैं।
- यदि इनर catch एक्सेप्शन हैंडल करता है और return/throw नहीं करता, तो आउटर catch नहीं चलेगा।
- यूजर-डिफाइंड एक्सेप्शन्स Exception क्लास को एक्सटेंड करनी चाहिए।
- Throwable इंटरफेस Error और Exception दोनों का बेस है।
- PHP 7+ में Throwable को catch करके दोनों Error और Exception पकड़े जा सकते हैं।
सुधारित उदाहरण (सही ब्रेसेस के साथ)
<?php
class myException extends Exception {
function message() {
return "error: " . $this->getMessage() . " in line no " . $this->getLine();
}
}
$x = 10;
$y = 0;
try {
try {
if (is_numeric($x) == FALSE || is_numeric($y) == FALSE) {
throw new myException("Non numeric data");
}
} catch (myException $m) {
echo $m->message();
return;
}
if ($y == 0) {
throw new DivisionByZeroError("Division by 0");
}
echo $x / $y;
} catch (DivisionByZeroError $e) {
echo $e->getMessage() . " in line no " . $e->getLine();
}
?>