2010-10-13 17 views
6

विधि में होने वाली ज्ञात त्रुटियों को संभालने के कुछ अच्छे तरीके क्या हैं?किसी विधि में ज्ञात त्रुटियों और त्रुटि संदेशों को संभालना

चलिए एक उदाहरण के रूप में उपयोगकर्ता पंजीकरण विधि लेते हैं। जब कोई उपयोगकर्ता साइन अप कर रहा है, तो एक विधि SignUp(User user) कहा जाता है। कुछ ज्ञात त्रुटियां हो सकती हैं जो हो सकती हैं।

  • ईमेल पहले
  • प्रयोक्ता नाम पहले से पंजीकृत है
  • पंजीकृत किया गया है आदि

आप विशिष्ट अपवाद फेंक सकता है:

public void SignUp(User user) 
{ 
    // Email already exists 
    throw new EmailExistsException(); 
} 

अब विशिष्ट अपवाद पकड़ा जा सकता है।

यह मेरी राय में बुरा है, क्योंकि प्रवाह नियंत्रण के लिए अपवादों का उपयोग किया जा रहा है।

आप एक बूलियन बताते हुए लौट सकता है अगर यह सफल रहा और एक त्रुटि होती है, तो तैयार हो जाओ होता है कि एक त्रुटि संदेश में पारित:

public bool SignUp(User user, out/ref string errorMessage) 
{ 
    // Email already exists 
    errorMessage = "Email already exists."; 
    return false; 
} 

मैं कुछ कारणों से इस तरह नहीं है।

  • एक मूल्य वापस किया जाना है। क्या होगा यदि विधि को मूल्य वापस करने की आवश्यकता है?
  • हर बार एक त्रुटि संदेश पारित किया जाना है।
  • विधि का उपभोक्ता यह निर्धारित करना चाहिए कि संदेश क्या है।

चलिए बस कुछ भी कहें जहां विधि में वास्तविक संदेश सेट खराब है।

आप त्रुटि कोड इस्तेमाल कर सकते हैं:

public enum Errors 
{ 
    Successful = 0, 
    EmailExists, 
    UsernameExists, 
    Etc 
} 

public Errors SignUp(User user) 
{ 
    // Email already exists 
    return Errors.EmailExists; 
} 

// or 

public void SignUp(User user, out/ref Errors error) 
{ 
    // Email already exists 
    error = Errors.EmailExists; 
} 

बहुत पिछले एक यहाँ एक मैं सबसे ज्यादा पसंद है, लेकिन मैं अभी भी यह एक पूरी बहुत पसंद नहीं है। मुझे एक त्रुटि कोड पास करने का विचार पसंद नहीं है। मुझे उस मामले के लिए कोड को वापस करने का विचार पसंद नहीं है।

मुझे कस्टम अपवादों का उपयोग करने का विचार पसंद है क्योंकि यह थोड़ा क्लीनर लगता है, लेकिन मुझे प्रवाह नियंत्रण के लिए अपवादों का उपयोग करने का विचार पसंद नहीं है। शायद इस उदाहरण की तरह विशिष्ट मामलों में, सिस्टम में पहले से ही एक ईमेल होना चाहिए एक अपवाद हो, और यह ठीक है।

इस स्थिति में अन्य लोगों ने क्या किया है?

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/409563/best-practices-for-exception-management- इन-जावा या ग) –

उत्तर

2

मैं का उपयोग कर इस मामले में होता है एक उपयोगकर्ता परिभाषित अपवाद एक विशेष संपत्ति (Reason नाम) के साथ NewUserRegistrationException कहा जाता है कि ऐसा न करने की कारण होते हैं पैदा करते हैं।

प्रगणक

public enum RegistrationErrorType 
{ 
    Successful = 0, 
    EmailAlreadyExists, 
    UsernameAlreadyExists, 
    Etc 
} 

अपने उदाहरण का उपयोग करना, बहुत समझा जा सकता है।

कौन तो अपने विधि सिर्फ .ToString() अपवाद सामान्य त्रुटि पॉपअप कर सकते हैं, या फोन करके एक नया उपयोगकर्ता रजिस्टर करने के लिए चाहता है (के बाद पढ़ प्रलेखन जाने के बाद) switchReason संपत्ति और तदनुसार प्रतिक्रिया (ईमेल क्षेत्र पर ध्यान केंद्रित करने , लाल पासवर्ड के साथ रंग, आदि)।

उदाहरण कोड:

public class NewUserRegistrationException : Exception 
{ 
    public RegistrationErrorType Reason { get; private set; } 
    public NewUserRegistrationException(RegistrationErrorType reason) 
     : base() 
    { 
     Reason = reason; 
    } 
    public NewUserRegistrationException(RegistrationErrorType reason, string message) 
     : base(message) 
    { 
     Reason = reason; //might as well create a custom message? 
    } 
    public NewUserRegistrationException(RegistrationErrorType reason, string message, Exception inner) 
     : base(message, inner) 
    { 
     Reason = reason; //might as well create a custom message? 
    } 
} 
की ([जावा या सी # में अपवाद प्रबंधन के लिए सर्वोत्तम प्रक्रियाएं]
+1

मैं प्रवाह नियंत्रण के लिए अपवाद का उपयोग कर पसंद नहीं है, लेकिन अगर यह एक त्रुटि है, तो यह एक त्रुटि है। मुझे लगता है कि समय से पहले पता लगाने के तरीके हो सकते हैं। फ़ाइल के साथ की तरह। खोलें, आप जांच लेंगे कि फ़ाइल पहले मौजूद है या नहीं। File.Open अभी भी एक FileNotFound अपवाद या कुछ मौजूद नहीं होना चाहिए यदि यह अस्तित्व में नहीं है। –

0

जब भी मैं इस तरह की एक आम समस्या के बारे में सोचना शुरू करता हूं तो पहली बात यह है कि कोई भी पहले से ही एक अच्छा समाधान के साथ आया है ... इसलिए जब एक Google खोज ".net सत्यापन फ्रेमवर्क" के लिए किया जाता है अच्छे परिणाम पॉप अप ...

हाल ही में मैंने TNValidate (http://tnvalidate.codeplex.com/)

+0

मैं वास्तव में मान्यता के रूप में इस के बारे में सोच नहीं किया। मुझे लगता है कि यह विशिष्ट उदाहरण है, सत्यापन का उपयोग किया जा सकता है। मैं सामान्य रूप से एक विधि बात कर रहा था। –

+0

मैं समझता हूँ, लेकिन tnvalidate पुस्तकालय की Validator.cs और ValidatorResult.cs वर्गों की जाँच करें और है कि ठीक उसी दृष्टिकोण आप ज्ञात त्रुटियों के साथ इस्तेमाल कर सकते हैं है। मैं यहाँ कस्टम अपवाद एक अच्छा समाधान उपयोग कर रहा है नहीं लगता है ... –

+0

तो, आपको लगता है वर्ग एक HasErrors विधि/संपत्ति है कि जाँच की जा सकती है और उस पर त्रुटियों की सूची के साथ संपत्ति के कुछ प्रकार होना चाहिए? । –

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