2013-01-07 10 views
6

मान लें कि मैं एक ASP.NET वेब API अनुप्रयोग का निर्माण कर रहा हूँ फेंक और यह निम्नलिखित संरचना है:फेंक या नहीं तरीकों ASP.NET वेब एपीआई परत द्वारा खपत से अपवाद

enter image description here

के रूप में आप आरेख से देख सकते हैं, एएसपी.नेट वेब एपीआई कोर डोमेन सेवा परत से बात करेगा (उदाहरण के लिए MembershipService कक्षा जिसमें GetUsers, CreateUser इत्यादि जैसी विधियां हैं) और मेरी सेवा कक्षाएं एक या एकाधिक भंडारों से निपटने के लिए बात करेंगे संचालन।

यह बहुत स्पष्ट है कि एक सेवा संचालन (जैसे MembershipService.CreateUser विधि) कई कारणों से विफल हो जाएगा (अनमेट स्थितियां, भंडार द्वारा छोड़ा गया अपवाद आदि) और यह वह स्थान है जहां मुझे संदेह है।

public class OperationResult { 

    public OperationResult(bool isSuccess) : this(isSuccess) { 
     IsSuccess = isSuccess; 
    } 

    public OperationResult(bool isSuccess, Exception exception) : this(isSuccess) { 
     Exception = exception; 
    } 

    public bool IsSuccess { get; private set; } 
    public Exception IsSuccess { get; private set; } 
} 

public class OperationResult<TEntity> : OperationResult { 

    public OperationResult(bool isSuccess) 
     : base(isSuccess) { } 

    public OperationResult(bool isSuccess, Exception exception) 
     : base(isSuccess, exception) { } 

    public TEntity Entity { get; set; } 
} 

या आपको लगता है कि और की तरह है कि सेवा के तरीकों सार नहीं करना चाहिए अपवाद कार्य करें:

आपको लगता है कि सेवा कक्षाएं अपवादों को संभालने और इस तरह के एक नीचे के रूप में परिणाम वस्तु के कुछ प्रकार वापसी करना चाहिए सीधे या अप्रत्यक्ष रूप से अपवाद फेंकना चाहिए (ऑपरेशन के लिए विशिष्ट एक नया अर्थपूर्ण अपवाद प्रकार बनाना और इसके अपवाद के रूप में फेंक दिया अपवाद डालना चाहिए)?

+0

कौन इस प्रश्न को रचनात्मक नहीं बनाना चाहता था? कृपया मुझे बताएं कि आप उच्च cuz प्राप्त करने के लिए क्या उपयोग करते हैं, जहां तक ​​मैं देख सकता हूं। – tugberk

उत्तर

3

जब आप प्रक्रिया में हैं, तो अपवादों का उपयोग करें।

+0

धन्यवाद! क्या आप इसके बजाय अपवाद प्रवाह को फेंक देंगे या इसे अधिक सार्थक कस्टम अपवाद प्रकार के अंदर लपेटेंगे? – tugberk

+0

@tugberk यह एक बड़ा सवाल है। स्तरित वास्तुकला के नियमों के बाद, आपको लपेटना चाहिए। क्या यह हर समय सही काम है? मुझे नहीं पता। –

+0

मैं समझता हूं। सहायता के लिए धन्यवाद। उदाहरण के लिए, मैं पहले से ही उपलब्ध .NET अपवादों को प्राथमिकता देता हूं यदि यह आवश्यक अर्थ देता है (उदा। 'ArgumentNullException')। – tugberk

1

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

यदि आप क्लाइंट और एपीआई दोनों को नियंत्रित करते हैं, तो परिणाम ऑब्जेक्ट या त्रुटि संदेश लौटने की मेरी निजी प्राथमिकता है। इसका कारण यह है कि मैं वास्तविक अपवादों के स्रोत के बारे में विस्तृत जानकारी कैप्चर करना चाहता हूं, लेकिन मैं गलत होने पर सबकुछ अपवाद नहीं चाहता हूं, जैसे पासवर्ड गलत है।

इस मामले में, उपयोगकर्ता को एक साधारण त्रुटि संदेश पर्याप्त से अधिक होगा। वास्तविक दुनिया के अनुभव से, घटना लॉग या लॉग फ़ाइल में रिकॉर्डिंग अपवाद रिकॉर्डिंग त्रुटि उत्पन्न होने पर हर बार एक ऑपरेशन कर्मियों पर एक बड़ा बोझ होता है जो यह निर्धारित करने की कोशिश कर रहा है कि कोई वास्तविक गलती हो रही है या नहीं, यह सिर्फ उपयोगकर्ता का टाइपो है या नहीं ।

2

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

मैं इस स्थिति में आमतौर पर क्या करता हूं सेवा सेवा में अपवाद को पकड़ना और इसे कस्टम अपवाद (इनरएक्सप्शन फ़ील्ड में मूल अपवाद के संदर्भ में) में दोबारा जोड़ना है।