2010-04-27 10 views
6

मेरे पास एक ऐसी प्रणाली है जहां कर्मचारी आईडी को तब तक अस्तित्व में रहना चाहिए जब तक कुछ अंतर्निहित समस्या न हो।सी # उपयोग पर पर्दा फेंक दें?

1:

public void GetEmployee(Employee employee) 
{ 
    bool exists = EmployeeRepository.VerifyIdExists(Employee.Id); 
    if (!exists) 
    { 
    throw new Exception("Id does not exist"); 
    } 
}  

या 2:

तरह से मैं इसे देख, मैं इस कोड की जाँच करने के दो विकल्प हैं वह यह है कि

public void GetEmployee(Employee employee) 
{ 
    EmployeeRepository.AssertIfNotFound(Employee.Id); 
} 

में # 2 स्वीकार्य विकल्प है सी # भाषा?

मुझे यह पसंद है क्योंकि यह उस में साफ है मैं "नया अपवाद फेंक (" bla bla bla ") वर्ग गुंजाइश outsite संदेश लिखने को देखकर पसंद नहीं है।

+1

क्यों न केवल आपकी VerifyIdExists विधि आपकी ओर से अपवाद फेंकती है? – Tejs

+0

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

उत्तर

3

यह निर्भर करता है कि आप Assert से क्या मतलब है।

आप Debug.Assert (या Trace.Assert का उपयोग कर सकते हैं यदि आप इसे रिहाई मोड में भी काम करना चाहते हैं)। हालांकि यह उपयोगी नहीं है क्योंकि यह प्रोग्राम को रोकता है और जब तक कोई उपयोगकर्ता कुछ दबाता है तब तक एक संवाद बॉक्स पॉप अप नहीं करता है। ऐसा नहीं है एक अनियंत्रित प्रणाली के लिए अच्छा है। इसलिए मैं ज्यादातर मामलों में फेंकने की सिफारिश करता हूं, हालांकि आप यह तय कर सकते हैं कि आप त्रुटि पर प्रतिक्रिया कैसे देना चाहते हैं - प्रोग्राम को रोकें, या बस लॉग इन करें और जारी रखने का प्रयास करें।

लेकिन अगर हम मानते हैं कि आपकी Assert विधि इसकी तर्क जांचती है और संभवतः अपवाद फेंकता है, तो हाँ मुझे लगता है कि यह करने का एक अच्छा तरीका है।

वास्तव में एक उदाहरण लेने के लिए, जॉन स्कीट के morelinq दोनों तरीकों का उपयोग किया जाता है। उदाहरण here के लिए:

public static IEnumerable<TSource> AssertCount<TSource>(
    this IEnumerable<TSource> source, 
    int count, 
    Func<int, int, Exception> errorSelector) 
{ 
    source.ThrowIfNull("source"); 
    if (count < 0) throw new ArgumentException(null, "count"); 
    errorSelector.ThrowIfNull("errorSelector"); 

    return AssertCountImpl(source, count, errorSelector); 
} 
+1

हां। मेरा दावा "अपवाद फेंकने" के लिए है। धन्यवाद जे। – guazz

+0

@guazz: पहली बार मैंने आपके प्रश्न को पढ़ा था, मैंने सोचा था कि आप जोर देकर फेंकने की तुलना कर रहे थे - और अन्य उत्तरों और वोटों को देखने से, तो बाकी सभी ने भी किया। आप इसे और अधिक स्पष्ट करने के लिए अपने प्रश्न को फिर से लिखना चाहेंगे। तर्क अपवाद के लिए –

+0

विस्तार विधि? –

1

उपयोग अपवाद हैं, इसके कि वे क्या देखते हैं - असाधारण परिस्थितियों। सभी मानक .NET पुस्तकालय ऐसी परिस्थितियों को संभालने की इस विधि का उपयोग करते हैं, इसलिए माइक्रोसॉफ्ट से आपके संकेत लेते हैं।

5

एक नियम के रूप में, आप केवल अपवाद असाधारण परिस्थितियों में फेंक देना चाहिए। चूंकि इस तरह की एक परिस्थिति, अपवाद फेंकना सही काम है।

0

दावे के पीछे विचार यह, जैसा कि मैंने हमेशा उन्हें का उपयोग किया है, कि वे तत्काल प्रतिक्रिया जब एक डीबग बिल्ड चल रहे हैं। आपके चेहरे में ऐसा कुछ हुआ जो कुछ हुआ। या फ़ाइल को लॉग इन करने के लिए लॉग इन किया गया है। जैसा कि ऊपर उल्लेख

अपवाद, असाधारण व्यवहार को संभालने के लिए उपयोग किया जाता है।

मुझे क्या करना, विशेष रूप से जल्दी परियोजनाओं जीवन चक्र में की तरह कुछ हो सकता है:

public void GetEmployee(Employee employee) 
{ 
    bool exists = EmployeeRepository.VerifyIdExists(Employee.Id); 
    Debug.Assert(exists, "employee does not exist for id: " + Employee.Id); 
    if (!exists) 
    { 
    throw new Exception("Id does not exist); 
    } 
} 

शायद Debug.Assert बाहर refractoring एक बार प्रारंभिक हिचकी के साथ पेश कर रहे हैं।

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