मैं एक एपीआई लिख रहा हूं जो एक सेवा से जुड़ता है जो या तो एक सरल "सफलता" संदेश देता है या विफलता के 100 से अधिक विभिन्न स्वादों में से एक है।यह इंगित करने का सर्वोत्तम अभ्यास तरीका है कि एक सर्वर अनुरोध विफल रहा है?
मूल रूप से मैंने इस विधि को लिखने के लिए सोचा था कि अगर यह सफल हुआ तो विधि कुछ भी नहीं लौटाती है, लेकिन यदि यह किसी भी कारण से विफल हो जाती है, तो यह अपवाद फेंकता है।
मुझे इस डिजाइन को बहुत ज्यादा ध्यान नहीं दिया गया था, लेकिन दूसरी तरफ मैं आज जोशुआ ब्लोच के "How to Design a Good API and Why it Matters" पढ़ रहा था, जहां वह कहता है "असाधारण स्थितियों को इंगित करने के लिए अपवादों को फेंक दें ... ग्राहक को उपयोग करने के लिए बाध्य न करें नियंत्रण प्रवाह के लिए अपवाद। " (और "इसके विपरीत, चुपचाप विफल न करें।")
दूसरी तरफ, मैंने देखा कि अनुरोध करते समय HttpWebRequest एक अपवाद फेंकने लगता है, एक प्रतिक्रिया को वापस करने के बजाय " 500 आंतरिक सर्वर त्रुटि "संदेश।
इस मामले में त्रुटियों की रिपोर्ट करने के लिए सबसे अच्छा पैटर्न क्या है? अगर मैं हर असफल अनुरोध पर अपवाद फेंकता हूं, तो क्या मैं भविष्य में किसी बिंदु पर भारी दर्द के लिए हूं?
संपादित करें: प्रतिक्रियाओं के लिए बहुत दयालु धन्यवाद। कुछ विस्तार:
- यह एक डीएलएल है जो ग्राहकों को उनके आवेदन में संदर्भित करने के लिए दिया जाएगा।
- उपयोग का एक समान उदाहरण
ChargeCreditCard(CreditCardInfo i)
होगा - जाहिर है जब चार्ज क्रेडिट कार्ड() विधि विफल हो जाती है, यह एक बड़ा सौदा है; मैं सिर्फ 100% निश्चित नहीं हूं कि मुझे प्रेस को रोकना चाहिए या उस जिम्मेदारी को ग्राहक को पास करना चाहिए।
संपादित दूसरा: मूल रूप से मैं पूरी तरह आश्वस्त है जो इन दो विधियों के उपयोग करने के लिए नहीं कर रहा हूँ:
try {
ChargeCreditCard(cardNumber, expDate, hugeAmountOMoney);
} catch(ChargeFailException e) {
// client handles error depending on type of failure as specified by specific type of exception
}
या
var status = TryChargeCreditCard(cardNumber, expDate, hugeAmountOMoney);
if(!status.wasSuccessful) {
// client handles error depending on type of failure as specified in status
}
उदा जब कोई उपयोगकर्ता क्रेडिट कार्ड चार्ज करने का प्रयास करता है, तो क्या कार्ड वास्तव में असाधारण परिस्थिति में अस्वीकार कर दिया गया है? क्या मैं इस प्रश्न को पहली जगह पूछकर खरगोश छेद में बहुत दूर जा रहा हूं?
1) कैसे एपीआई पहुँचा दिया जाएगा:
"अपवाद, अपवाद, अपवाद!" (* बल्मर नृत्य *) –
क्या यह आरईएसटी, या एसओएपी, या दोनों होगा? –
'WebException'' WebRequest's 'GetResponse() 'द्वारा फेंक दिया गया है' प्रोटोकॉल प्रारूप के संबंध में _valid_ है 'WebResponse' है। तो आपके लिए, यह या तो 'बीसीएल' कक्षाओं के डिजाइन को बनाए रख रहा है और कुछ समान बना सकता है या नहीं ... नहीं। आपके आवेदन का लक्ष्य क्या है? क्या यह आवश्यक है कि सर्वर अनुरोध सफल हो जाए? फिर फेंक दो। या क्या अतिरिक्त डेटा रखना अच्छा है? – ordag