अपडेट करें:
PHP 7.1 के रूप में, यह उपलब्ध है।
वाक्य रचना है:
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
डॉक्स: https://www.php.net/manual/en/language.exception.php#example-287
RFC: https://wiki.php.net/rfc/multiple-catch
प्रतिबद्ध: https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
7.1 से पहले PHP के लिए:
ये अन्य उत्तर क्या कहते हैं, इसके बावजूद आप पकड़ सकते हैं AError
और BError
उसी ब्लॉक में (यदि आप अपवादों को परिभाषित करते हैं तो यह कुछ आसान है)। यहां तक कि यह भी कि ऐसे अपवाद हैं जिन्हें आप "के माध्यम से गिरना" चाहते हैं, आपको अभी भी अपनी आवश्यकताओं से मेल खाने के लिए एक पदानुक्रम को परिभाषित करने में सक्षम होना चाहिए।
abstract class MyExceptions extends Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
फिर:
catch(LetterError $e){
//voodoo
}
जैसा कि आप यहां और यहां देख सकते हैं , यहां तक कि SPL
डिफ़ॉल्ट अपवादों में एक पदानुक्रम है जिसका आप लाभ उठा सकते हैं। इसके अतिरिक्त, जैसा कि PHP मैनुअल में कहा गया है :
जब एक अपवाद को फेंक दिया जाता है, तो कथन के बाद वाले कोड को निष्पादित नहीं किया जाएगा, और PHP पहले मिलान पकड़ने वाले ब्लॉक को खोजने का प्रयास करेगा।
इसका मतलब आप भी कर सकते थे
class CError extends LetterError {}
जिसे आपको अलग से संभालने की ज़रूरत है AError
या BError
, इसलिए आपका कैच स्टेटमेंट इस तरह दिखेगा:
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
यदि आपके पास ऐसा मामला था जहां बीस या अधिक अपवाद थे जो वैध रूप से एक ही सुपरक्लास के तहत थे, और आपको उनमें से पांच (या जो भी बड़े-ईश समूह) को संभालने की आवश्यकता थी और बाकी दूसरे, आप कर सकते हैं।
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
और तब:
catch (Group1 $e) {}
जब अपवाद की बात आती है तो ओओपी का उपयोग करना बहुत शक्तिशाली है। जैसी चीजों का उपयोग करना get_class
या instanceof
हैक करना, और यदि संभव हो तो उन्हें टाला जाना चाहिए।
एक और समाधान जो मैं जोड़ना चाहूंगा, वह है अपवाद की हैंडलिंग कार्यक्षमता को अपनी विधि में रखना।
आप ऐसा कर सकते थे
function handleExceptionMethod1(Exception $e)
{
//voodoo
}
function handleExceptionMethod2(Exception $e)
{
//voodoo
}
मान लिया जाये कि वहाँ बिल्कुल कोई जिस तरह से आप अपवाद वर्ग पदानुक्रम या इंटरफेस को नियंत्रित कर सकते हैं (और वहाँ लगभग हमेशा होगा एक तरीका हो), तो आप निम्नलिखित कर सकते हैं:
try
{
stuff()
}
catch(ExceptionA $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionB $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionC $e)
{
$this->handleExceptionMethod1($e);
}
catch(Exception $e)
{
$this->handleExceptionMethod2($e);
}
इस तरह, आपके पास अभी भी केवल एक ही कोड स्थान है जिसे आपको संशोधित करना है अगर आपके अपवाद हैंडलिंग तंत्र को बदलने की आवश्यकता है, और आप OOP के सामान्य निर्माणों के भीतर काम कर रहे हैं।