2012-04-02 13 views
6

यह एक n00bish सवाल हो सकता है, लेकिन जो भी हो। फॉर्म सत्यापन के लिए अपवादों का उपयोग करना ठीक है? मान लें कि मेरे पास एक ऐसा फॉर्म है जो उपयोगकर्ताओं को उनके नाम और ईमेल के लिए पूछता है, निम्नलिखित करने का अधिकार है?फॉर्म सत्यापन के लिए अपवादों का उपयोग किया जाना चाहिए?

try { 
    if (empty($_POST["name"])) { 
     throw new UserRegistrationException("Your name cannot be empty."); 
    } 

    if (filter_var($_POST["email"])) { 
     throw new UserRegistrationException("Invalid email"); 
    } 

    // Save new user into database 
} catch (UserRegistrationException $e) { 
    // Show errors on screen 
} 
इस -यदि

इसके अलावा वास्तव में है- ऐसा करने के लिए सही तरीका उपयोगकर्ता दोनों एक खाली नाम और एक अमान्य ईमेल प्रस्तुत करता है, तो है, अपवाद के दोनों निष्पादित या केवल एक ही पहले प्रतीत होता है कि होगा (इस मामले में एक नाम)?

मैं PHP का उपयोग कर रहा हूं।

+0

यह अपवादों का उपयोग करने का निश्चित रूप से एक अजीब तरीका है। "क्या दोनों अपवाद निष्पादित होंगे या केवल पहले दिखाई देंगे" - क्या कोड की 5 पंक्तियां लिखना और खुद को देखना मुश्किल है? – zerkms

+0

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

+0

@ माइकल मैंने ऐसा सोचा था ... हालांकि यह अपवादों का उपयोग करने के लिए एक अच्छा मौका था (जैसा कि अमान्य इनपुट को _exceptional_ माना जाना चाहिए), लेकिन अगर मैं/else के – federicot

उत्तर

4

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

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

प्रश्नों के उत्तर देने के लिए, दो अपवादों को एक ही समय में नहीं फेंक दिया जा सकता है। पहुंचने वाला पहला फेंक कथन फेंक दिया जाएगा। यह कहना नहीं है कि कभी-कभी इसे किसी अन्य प्रकार के अपवाद के रूप में पुनर्स्थापित करने का अर्थ नहीं होता है।

+0

के रूप में फेंक दिया जाता है, मुझे लगता है कि यह एक मामूली मामला है (और मैं एक सूची संकलित भी कर रहा हूं) त्रुटि संदेशों में) तो इस मामले में अपवाद नहीं होंगे – federicot

+0

आप अपवाद वर्ग का निर्माण भी अपवादों के ढेर को जोड़ने के लिए बढ़ा सकते हैं, फिर एक समेकित अपवाद फेंक सकते हैं (जिसे आप त्रुटि संदेशों की सूची संकलित करने के लिए उपयोग कर सकते हैं, लूप के माध्यम से ब्याज का एक विशेष, आदि खोजें) – landons

+0

या आप पुराने तरीके से सत्यापन त्रुटियों का संग्रह बना सकते हैं (उदाहरण के लिए सरणी में जोड़ना), और फिर उन सभी त्रुटियों वाले एक सत्यापन सत्यापन को फेंक दें। –

4

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

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

+5

आपकी परिभाषा के अनुसार, प्रत्येक अपवाद अप्रत्याशित है। दुनिया में कैसे आप जानते होंगे कि इसे कैसे संभालना है? मैं तर्क दूंगा कि उन मामलों के लिए अपवादों का उपयोग किया जाता है जहां प्राथमिक निष्पादन जारी नहीं होना चाहिए। – landons

+0

उल्लेख नहीं है कि कोई भी सरणी में सत्यापन त्रुटियों को जोड़ सकता है और उसके बाद उस स्ट्रिंग को विस्फोट कर सकता है जिसे अपवाद – Alex

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