2012-01-28 14 views
5

मैं php के लिए नया हूं और मैं इस तथ्य से थोड़ा उलझन में हूं कि किसी विधि से उसके कॉलर तक कोई त्रुटि ऑब्जेक्ट संचार नहीं होता है।PHP खराब आदत में त्रुटि ऑब्जेक्ट्स लौट रहा है?

  1. एक विधि चाहिए नहीं जानकारी त्रुटि के फोन करने वाले यह सिर्फ एक त्रुटि एक ट्रिगर करता है तो अगर यह यह E_USER_ERROR नहीं है सिर्फ गलत लौट सकते हैं बताने के लिए:

    ये दो तरीके मैं उपयोग करने का तरीका हैं कॉलर कुछ गलत हो गया।

  2. दूसरी तरफ अगर किसी विधि को कॉलर को कुछ त्रुटि जानकारी वापस भेजने की आवश्यकता होती है तो अपवाद उठाया जाना चाहिए।

कोको से आ रहा है मैंने असाधारण स्थितियों (प्रोग्रामर गलतियों के कारण गैर पुनर्प्राप्ति योग्य त्रुटियों) पर अपवादों का उपयोग करना सीख लिया है। किसी भी अन्य मामले में बस कॉलर को एक त्रुटि ऑब्जेक्ट पास करें।

  • क्या PHP में दर्शन अलग है?
  • क्या कॉलर को त्रुटि डेटा वापस भेजने के लिए स्टैंडर तंत्र अपवाद हैं?
  • क्या मुझे अपनी खुद की त्रुटि ऑब्जेक्ट्स प्रोग्रामिंग से बचने और PHP पैटर्न के साथ संगत होने के तरीके के लिए पैरा के रूप में पास करना चाहिए?
+2

मैं इसे चारों ओर बदलने जा रहा हूं और पूछता हूं "अपवाद बढ़ाने के बजाय त्रुटि ऑब्जेक्ट को वापस करना कब बेहतर है?"। –

उत्तर

8

पीएचपी का संकेत है और अपने कार्यक्रम के प्रवाह में त्रुटियों से निपटने के लिए दो मुख्य तंत्र है:

कौन सा चुनना है आपकी व्यक्तिगत वरीयता पर निर्भर करता है। अपवाद वस्तुएं हैं, इसलिए यदि आप ओओपी करना चाहते हैं या किसी अन्य भाषा से आना चाहते हैं जो अपवादों का भी उपयोग करता है, तो आप उनका उपयोग करना चाहेंगे। गैर-अपवाद आधारित त्रुटि हैंडलिंग उन सभी नोटिस के लिए है, चेतावनी और त्रुटियां PHP उत्सर्जित कर सकती हैं, साथ ही साथ आप उनके रूपों के मालिक भी हो सकते हैं। यदि आप इन्हें अपवादों में बदलना चाहते हैं, तो ErrorException पर एक नज़र डालें।

हालांकि, जैसा कि आपने पहले ही उल्लेख किया है: अपवाद पुनर्प्राप्त करने योग्य स्थितियों के लिए हैं। नियमित नियंत्रण प्रवाह के प्रबंधन के लिए वे नहीं हैं। नतीजतन, अपवाद किसी कॉलर को त्रुटि संदेश भेजने के लिए मानक तंत्र का कुछ प्रकार नहीं है, उदा। आपको नहीं करना चाहिए:

class FooValidator 
{ 
    public function isValid($valueToValidate) 
    { 
     if ($this->satisfiesRules($valueToValidate) { 
      return true; 
     } 
     throw new ValidationException('Foo didnt satisfy rule Bar'); 
    } 
} 

और वे कॉलर में कोशिश/पकड़ें। एक असफल सत्यापन एक पुनर्प्राप्ति योग्य स्थिति है।

एक विकल्प एक Notification Object लागू करने के लिए होगा: ऊपर के उदाहरण में

class FooValidator 
{ 
    public function isValid($valueToValidate, Notification $notification) 
    { 
     if ($this->satisfiesRules($valueToValidate) { 
      return true; 
     } 
     $notification->addMessage('Foo didnt satisfy rule Bar'); 
     return false; 
    } 
} 

, सत्यापनकर्ता रिटर्न केवल एक बूलियन लेकिन क्यों सत्यापन पारित कर दिया अधिसूचना वस्तु में विफल रहा है के बारे में अतिरिक्त जानकारी एकत्रित कर सकते हैं।कॉल से त्रुटि ऑब्जेक्ट लौटने से यह बहुत साफ है, क्योंकि हमें रिटर्न प्रकार की जांच नहीं करनी है। अगर सत्यापन गलत हो जाता है, तो हम जानते हैं कि हम अधिसूचना वस्तु की जांच कर सकते हैं। चूंकि वस्तुओं को संदर्भ द्वारा पारित किया जाता है, इसलिए हमें ऑब्जेक्ट को कॉल से वापस करने की आवश्यकता नहीं होती है लेकिन कॉलर से एकत्रित संदेशों तक पहुंच होती है।

+0

मुझे यह जवाब पसंद है, लेकिन मुझे इस तर्क से आश्वस्त नहीं है कि आपको प्रवाह नियंत्रण के लिए अपवादों का उपयोग नहीं करना चाहिए। क्यों नहीं? क्या अपवादों का प्रसार किसी स्तर पर बाहरी कार्य को सबसे उचित तरीके से किसी त्रुटि से पुनर्प्राप्त करने की अनुमति नहीं देता है? हम लगभग किसी भी चीज़ से "पुनर्प्राप्ति" कर सकते हैं जिसे हमने डिफ़ॉल्ट मान वापस लौटने की अपेक्षा नहीं की थी, लेकिन फिर यह मूल्यांकन करने का तर्क है कि वापसी मूल्य वैध कॉल का परिणाम है या नहीं, कॉलर को छोड़ दिया गया है। एक अपवाद स्पष्ट रूप से इंगित करता है कि कुछ गलत है और सबसे उपयुक्त हैंडलर तक फैलता है। कृपया मुझे –

+1

@ me232 शिक्षित करें एक अपवाद इंगित करता है कि असाधारण कुछ हुआ है (केवल कुछ गलत नहीं)। एक असफल सत्यापन (ऊपर उदाहरण के अनुसार) असाधारण नहीं है। अपवाद हैंडलिंग प्रक्रिया के माध्यम से इसे चलाने के लिए कोई कारण नहीं है। यह भी देखें http://www.c2.com/cgi/wiki?DontUseExceptionsForFlowControl और http://schlitt.info/opensource/blog/0724_python_good_bad_evil_03_flow_control_exceptions.html – Gordon

+0

मैं आपके उदाहरण में सहमत हूं कि अपवाद का उपयोग काफी व्यर्थ है, वापसी के बाद झूठ का मूल्य वैसे भी पर्याप्त संभव है। यह कार्य स्वयं समस्या से ठीक होने में सक्षम प्रतीत होता है। मान लीजिए कि आपके पास एक ऑब्जेक्ट को दूसरे में परिवर्तित करने का एक और जटिल उदाहरण है। क्या तर्क अपवाद फेंकना गलत है यदि तर्क रूपांतरण के लिए उपयुक्त नहीं है? क्या सभी संभावित कॉलर्स कुछ सत्यापन तर्क लागू कर सकते हैं? –

0

PHP में लगभग सब कुछ संभव है इसलिए वास्तव में कोई अच्छा तरीका नहीं है।

php.net पर अपवाद पर एक नज़र डालें http://php.net/manual/en/language.exceptions.php

+5

मुझे दर्दनाक तरीके से पता चला है कि हर भाषा के लिए लगभग हर चीज संभव है, यही कारण है कि डिज़ाइन पैटर हमें जीवन को आसान बनाते हैं, हमें पहिया को फिर से शुरू करने और दूसरों के अनुभव से सीखने से बचाते हैं। आधिकारिक दस्तावेज़ कभी भी त्रुटि वस्तुओं के बारे में बात नहीं करते हैं, इसलिए मैं पूछता हूं। –

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