2015-07-06 11 views
5

मुझे अपवाद, अमान्य अर्ग्यूमेंट अपवाद या अप्रत्याशित ValueException का उपयोग कब करना चाहिए?अपवाद, अमान्य अर्ग्यूमेंट अपवाद या अप्रत्याशित ValueException के बीच क्या अंतर है?

मैं उनके बीच असली भिन्न नहीं जानता क्योंकि मैंने हमेशा अपवाद का उपयोग किया था।

+0

http://tutorials.jenkov.com/java-exception-handling/exception-hierarchies.html देखें – VolkerK

उत्तर

8

विभिन्न अपवाद आपको अपवाद को पकड़ने और संभालने के तरीके पर अधिक ग्रैन्युलरिटी और नियंत्रण देते हैं।

एक कक्षा पर विचार करें जहां आप कई चीजें कर रहे हैं - उदा। इनपुट डेटा प्राप्त करना, इनपुट डेटा को सत्यापित करना और फिर इसे कहीं सेव करना। आप यह तय कर सकते हैं कि यदि गलत या खाली तर्क get() विधि पर पास किए गए हैं, तो आप InvalidArgumentException फेंक सकते हैं। सत्यापन करते समय, यदि सामान्य से कुछ बाहर है या मेल नहीं खाता है तो आप UnexpectedValueException फेंक सकते हैं। अगर कुछ अप्रत्याशित होता है तो आप एक मानक Exception फेंक सकते हैं।

जब आप पकड़ रहे हैं तो यह उपयोगी हो जाता है, क्योंकि आप विभिन्न तरीकों से विभिन्न प्रकार के अपवादों को संभाल सकते हैं। उदाहरण के लिए:

class Example 
{ 
    public function get($requiredVar = '') 
    { 
     if (empty($requiredVar)) { 
      throw new InvalidArgumentException('Required var is empty.'); 
     } 
     $this->validate($requiredVar); 
     return $this->process($requiredVar); 
    } 

    public function validate($var = '') 
    { 
     if (strlen($var) !== 12) { 
      throw new UnexpectedValueException('Var should be 12 characters long.'); 
     } 
     return true; 
    } 

    public function process($var) 
    { 
     // ... do something. Assuming it fails, an Exception is thrown 
     throw new Exception('Something unexpected happened'); 
    } 
} 

ऊपर के उदाहरण कक्षा में, जब यह बुला तुम इतनी तरह अपवादों में से catch कई प्रकार के हो सकते हैं:

try { 
    $example = new Example; 
    $example->get('hello world'); 
} catch (InvalidArgumentException $e) { 
    var_dump('You forgot to pass a parameter! Exception: ' . $e->getMessage()); 
} catch (UnexpectedValueException $e) { 
    var_dump('The value you passed didn\'t match the schema... Exception: ' . $e->getMessage()); 
} catch (Exception $e) { 
    var_dump('Something went wrong... Message: ' . $e->getMessage()); 
} 

इस मामले में आप एक UnexpectedValueException इस तरह मिलती है: string(92) "The value you passed didn't match the schema... Exception: Var should be 12 characters long."

यह भी ध्यान दिया जाना चाहिए कि these exception classes all end up extending from Exception वैसे भी, इसलिए यदि आप InvalidArgumentException या दूसरों तो वे Exception पकड़ने वालों से वैसे भी पकड़ा हो जाएगा के लिए विशेष संचालकों को परिभाषित नहीं है। तो वास्तव में, उनका उपयोग क्यों नहीं करते?

संबंधित मुद्दे