निम्नलिखित कोड पर विचार करें।
class C {}
/**
* @throws InvalidArgumentException
*/
function classCreateInstance($class) {
if (!is_string($class)) {
throw new InvalidArgumentException("Class name must be a string.");
}
if (!class_exists($class)) {
throw new InvalidArgumentException("Class "$class" does not exist.");
}
return new $class();
}
/**
* @return C
*/
function foo() {
return classCreateInstance(C::class);
}
एक ऐसा कार्य है जो अपवाद फेंक सकता है, क्योंकि यह इसके बारे में कुछ भी नहीं जानता है $class
तर्क।
दूसरी ओर, कॉलिंग कोड जानता है कि"सी" एक वैध वर्ग का नाम है, इसलिए यह मानना है कि "अवैध अमान्यता अपवाद" कभी नहीं होगा। यह verbose कोशिश / पकड़ से बचना चाहते हैं, और यह अपने स्वयं के होने से बचना चाहते हैं @throws
टैग। विशेष रूप से यदि इसे "अनुमति" नहीं है, क्योंकि यह एक इंटरफ़ेस को कार्यान्वित कर रहा है जो अपवाद को एनोटेट नहीं करता है।
लेकिन, एक आईडीई / स्वचालित कोड सत्यापन परिप्रेक्ष्य से, इस अपवाद को अनदेखा करना सुरक्षित नहीं है।
तो .. एक कॉलिंग कोड परिप्रेक्ष्य से "लगभग असंभव" अपवादों से निपटने का सही तरीका क्या है?
उत्तर:
जवाब के लिए 0 № 1जावा में "चेक किए गए" अपवाद वर्ग और "अनचेक" अपवाद वर्गों के बीच एक अंतर है। केवल चेक अपवाद इंटरफ़ेस अनुबंध का हिस्सा हैं, जबकि एक "अनचेक" अपवाद फेंकने की अनुमति है भले ही इंटरफ़ेस इसे घोषित न करे।
जावा में, "कभी नहीं होना चाहिए" मामले में, कोई एक अनचेक अपवाद फेंक देगा - उदा। एक "रनटाइम अपवाद"।
PHP में, यह सभी सम्मेलन आधारित है। वे जो भी अपवाद चाहते हैं उन्हें फेंक सकते हैं। एक जोड़ना @throws
डॉक्टर टिप्पणी में टैग अच्छा है, लेकिन यह भाषा द्वारा लागू नहीं है।
हालांकि, एक आईडीई, या संभवतः अन्य कोड समीक्षा उपकरण, चेक बनाम अनचेक अपवादों के जावा मॉडल के आधार पर कोड का विश्लेषण करने के लिए कॉन्फ़िगर किया जा सकता है।
जैसे PhpStorm में विकल्पों की आवश्यकता नहीं है @throws
RuntimeException और LogicException के लिए दस्तावेज़ टैग। इसलिए यह इन्हें "अनचेक" के रूप में पेश करने की अनुमति देगा, लेकिन फिर कस्टम अपवाद वर्ग लिखें और उन्हें जावा में "चेक किए गए अपवाद" जैसे व्यवहार करें।
PHP में मूल अपवाद वर्ग: http://php.net/manual/en/spl.exceptions.php#spl.exceptions.tree
यह नहीं कि ये सभी LogicException या RuntimeException से प्राप्त होते हैं, इसलिए उन्हें सभी को "अनचेक" माना जाएगा। केवल रूट वर्ग, Exception
(और कस्टम बाल कक्षाओं) को "चेक" के रूप में माना जाएगा।
इस भेद का भी अर्थ है कि यदि आप एक कॉल करते हैंकोई घोषित / एनोटेटेड अपवाद के साथ विधि / फ़ंक्शन, आपको अभी भी यह विचार करने की आवश्यकता है कि एक अपवाद को फिर भी फेंक दिया जा सकता है। इसे कवर किया जा सकता है उदा। आवेदन के शीर्ष स्तर पर एक कोशिश / पकड़ से। (उदा। एक index.php)