2009-03-16 30 views
46

बनाम कोशिश {} पकड़ {} बनाम प्रयास का लाभ क्या है, मैं php से पीडीओ में सादा mysql से स्विच कर रहा हूं और मैंने देखा है कि त्रुटियों के परीक्षण के लिए सामान्य तरीका प्रयास/पकड़ का उपयोग कर रहा है अगर/अन्य संयोजनों के बजाय संयोजन।{} और {}

उस विधि का क्या फायदा है, क्या मैं अलग-अलग चरणों (कनेक्ट, तैयार, निष्पादित इत्यादि) के लिए सभी त्रुटियों को संभालने के लिए कई नेस्टेड के बजाय एक कोशिश/पकड़ ब्लॉक का उपयोग कर सकता हूं?

उत्तर

43

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

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

एक चीज जिसे आप देखना चाहते हैं, कोशिश/पकड़ का मैला उपयोग है। कोशिश करें/पकड़ को खराब प्रोग्रामिंग से बचाने के लिए इस्तेमाल नहीं किया जाना चाहिए - "मुझे नहीं पता कि अगर ऐसा होता है तो मैं क्या करूँगा इसलिए मैं इसे एक कोशिश/पकड़ में लपेटने जा रहा हूं और सबसे अच्छा" दयालु प्रोग्रामिंग का। आमतौर पर आप उन अपवादों को प्रतिबंधित करना चाहते हैं जिन्हें आप कोड से संबंधित नहीं हैं (सर्वर डाउन, खराब क्रेडेंशियल्स इत्यादि) ताकि आप कोड से संबंधित त्रुटियों को ढूंढ सकें और ठीक कर सकें (शून्य पॉइंटर्स इत्यादि) ।)।

+0

बहुत बहुत धन्यवाद! जिज्ञासा से, आप एक क्वेरी को कैसे संभाल/योग्यता प्राप्त करेंगे जो डेटा की अपेक्षा करते समय खाली पंक्ति में परिणाम देगा (उदाहरण के लिए जब कोई मैन्युअल रूप से क्वेरी स्ट्रिंग में कोई संख्या बदलता है)? – jeroen

+0

सटीक परिस्थिति पर निर्भर करता है, लेकिन यदि यह संभव है कि क्वेरी कोई डेटा नहीं लौटाएगी तो मैं केवल यह जांचूंगा कि डेटा था (पंक्ति गणना! = 0) और इसके बजाय "क्वेरी कोई परिणाम नहीं लौटा" संदेश प्रस्तुत करें। – tvanfosson

12

आम तौर पर, प्रयास-पकड़ ब्लॉक बहुत अच्छे होते हैं क्योंकि जब भी अपवाद होता है तो वे टूट जाएंगे (कैच स्टेटमेंट पर जाएं)। यदि-और ब्लॉक आप पर भरोसा करते हैं कि त्रुटि कब होगी।

संपादित करें: इसके अलावा, ब्लॉक को पकड़ने से आपके कोड को रोकने से रोक नहीं पाएंगे।

+0

अच्छा बिंदु (जब कोई त्रुटि प्रभावित होती है तो कैच रोकना बंद नहीं करेगा, विशेष रूप से यदि आप एक संकीर्ण अपवाद प्रकार को संभालते हैं) –

5

बयान में एकाधिक के बजाय एक प्रयास/पकड़ का उपयोग करके यह बिल्कुल फायदा है। आप किसी भी अप्रत्याशित त्रुटियों को पकड़ने में सक्षम होंगे।

3

चूंकि पीडीओ ऑब्जेक्ट्स का उपयोग कर रहा है, इसलिए अगर कोई त्रुटि होती है तो वे अपवाद उठा रहे हैं। पुराना mysql/mysqli केवल फ़ंक्शंस थे और अपवादों को फेंक नहीं दिया, उन्होंने बस त्रुटि कोड लौटा दिए। प्रयास/कैच का उपयोग तब किया जाता है जब कोड से अपवाद को फेंक दिया जा सकता है, और आप इसे पकड़-खंड में पकड़ते हैं, जो त्रुटियों को संभालने के लिए एक ऑब्जेक्ट उन्मुख तरीका है। यदि आप/अन्य ब्लॉक के साथ अपवादों को पकड़ नहीं सकते हैं - वे कोशिश/पकड़ के साथ कुछ भी साझा नहीं करते हैं।

+1

माइस्क्ली एक्सटेंशन ने एक कार्यात्मक और ओओ एपीआई दोनों का खुलासा किया। –

7

ऑब्जेक्ट बिजनेस लॉजिक से एरर हैंडलिंग तर्क को पूरी तरह से अलग करें/पकड़ें।

3

@Perchik:

मेरे त्रुटि से निपटने के सामान्य दर्शन:

आप चाहिए उपयोग करता है, तो/बाकी सभी मामलों जैसा कि आप उम्मीद संभालने के लिए। आपको सब कुछ (ज्यादातर मामलों में) को संभालने के लिए {} पकड़ {} का उपयोग करने का प्रयास करें क्योंकि एक उपयोगी अपवाद उठाया जा सकता है और आप इससे बग की उपस्थिति के बारे में जान सकते हैं। आप उन परिस्थितियों में {} पकड़ {} का प्रयास करें जहां आपको संदेह है कि कुछ गलत हो सकता है/नहीं होगा और आप नहीं चाहते हैं कि यह पूरे सिस्टम को नीचे लाए, जैसे नेटवर्क टाइमआउट/फ़ाइल सिस्टम एक्सेस समस्याओं, फाइलें मौजूद नहीं हैं , आदि

Vexing exceptions

+0

ठीक है, मैं आपसे सहमत हूं। शायद मैं oversimplified। कोशिश करने के लिए केवल तभी उपयोग किया जाना चाहिए जब कुछ गलत हो और आप नहीं चाहते कि यह आपके प्रोग्राम को मार डाले। – Perchik

+0

"जैसे नेटवर्क टाइमआउट/फाइल सिस्टम एक्सेस समस्याएं", वहां पर सुनहरा उदाहरण है, इस बात पर विचार करते हुए कि हम एक ऐप या यहां तक ​​कि एक वेब पेज से बात कर रहे एकाधिक सर्वर पर कितने निर्भर हैं .... – cartalot

5

फेंक और एक अपवाद को पकड़ने एक महंगी ये किसी भी आदिम आपरेशन के साथ तुलना में ऑपरेशन है। यदि यह कोड का एक टुकड़ा है जिसे अच्छी तरह से करने की आवश्यकता है (उदाहरण के लिए, एक तंग पाश में), तो आप अपने उपयोग के मामले को देखना चाहेंगे - यदि आप अपेक्षाकृत अक्सर अपवादों को फेंकने की अपेक्षा करते हैं, तो आप बेहतर होंगे/अन्य छिद्र-वार (जब तक अंतर्निहित कोड सिर्फ आपके लिए अपवाद लपेटता है, उस स्थिति में कोई लाभ नहीं होता है)। यदि अपवाद केवल दुर्लभ परिस्थितियों में फेंक दिए जाते हैं, तो आप एक तंग लूप में शाखा के ऊपरी हिस्से से बचने के लिए प्रयास/पकड़ के साथ बेहतर हो जाते हैं।

7

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

आप के लिए लाभ, प्रणाली के एक उपभोक्ता के रूप में नहीं बल्कि कुछ अस्पष्ट त्रुटि कोड वापस जो

  1. नाम दिया जाएगा एक सरल एक अपवाद वस्तु बूलियन झूठी है कि यह विफल रहा है, आप प्राप्त हो रही है, या से इस तरह से कि यह और भी स्पष्ट क्या गलत हुआ है में (अगर मैं सही याद है, पीडीओ केवल एक अपवाद प्रकार है, लेकिन अन्य प्रणालियों त्रुटियों के विभिन्न प्रकार के लिए कई प्रकार के अपवाद होते हैं)

  2. मई/तरीकों और गुण जो शामिल करना चाहिए का पता लगाने में आपकी सहायता कर सकते हैं क्यों exc eption फेंक दिया गया

वैसे भी सिद्धांत है। बहुत सारे स्मार्ट लोग हैं जो दावा करते हैं कि अपवाद जाने का रास्ता है। ऐसे कई स्मार्ट लोग भी हैं जो सोचते हैं कि अपवाद शैतान हैं, और आलसी सिस्टम डेवलपर्स के लिए एक क्रैच है। इस मुद्दे पर सर्वसम्मति से कुछ भी नहीं है।

0

पूरी तरह से @Jared अपडाइक

आमतौर पर अपवाद हैंडलिंग उपयोगकर्ता कम या इसके बारे में कुछ भी नहीं जानते हुए भी साथ किया जाता है के साथ सहमत हैं। दूसरी तरफ, सिस्टम के उपयोगकर्ता को पता है कि अगर किसी और ब्लॉक के अंदर क्या होता है।

उदाहरण के लिए। यह एक "अन्य" खंड होना चाहिए जो एक एटीएम उपयोगकर्ता दिखाता है, जब उसकी शेष राशि कम होती है तो संदेश "अपर्याप्त बैंक शेष राशि" होता है। और यह संदेश किसी भी कारण से "पकड़" ब्लॉक के अंदर नहीं बैठ सकता !!

3

हर कोई किसी और अच्छा जवाब था - लेकिन मैं समझ मैं अपने ही फेंक में:

  1. ट्राई/कैच एक वास्तविक अपवाद संचालन तंत्र है - इसलिए यदि आप अपने अपवाद बदलने के लिए, यह स्वचालित रूप से सभी की कोशिश पर काम करेंगे/पकड़ बयान।
  2. कोशिश/पकड़ एक बड़े अपवाद के मामले में भी कोड चलाने का मौका देता है जो कि/अन्यथा को मार सकता है और इसके अलावा, प्रयास कथन वापस लुढ़का जा सकता है (यदि आप समझदार हैं)।
1

विरासत के साथ प्रयास करें का उपयोग करके PHP में, हम किसी अन्य वर्ग से अपवाद फेंक सकते हैं।

उदाहरण: - मैं controller में हूं और Models का उपयोग करके उपयोगकर्ता डेटा को सत्यापित कर रहा हूं।

यदि कोई त्रुटि ट्रिगर होती है, तो मुझे बस Model विधियों से अपवाद फेंकना होगा।

प्रयास में निष्पादन Catch ब्लॉक में टूट जाएगा और पकड़ा जाएगा।

तो बूल वैल लौटने और इसे जांचने के लिए कम ओवरहेड है।

इसके अलावा Try Catch से अच्छा काम करता है जब श्रृंखला में उपयोग करते हुए (Try - Catch एक और Try - Catch अंदर)।

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