2012-03-02 23 views
5

यह मेरा पहला एप्लिकेशन है जो अपवादों के साथ ठीक से निपटेंगे। यह एक डब्ल्यूसीएफ सेवा है। पहले सभी ही मेरे लिए सरल ऐप्स थे। सी # में अपवाद हैंडलिंग के बारे में मुझे बहुत कम ज्ञान है।अपवादों को कैसे पकड़ें

MembershipUser memUser = Membership.GetUser(username); 

DatabaseDataContext context = new DatabaseDataContext(); 
UserMembership user = UserMembership.getUserMembership(memUser); 
ItemsForUser itemUser = Helper.createItemForUser(ref item, memUser); 
Helper.setItemCreationInfo(ref item, user); 
context.Items.InsertOnSubmit(item); 
context.SubmitChanges(); 

इस कोड को कुछ अपवादों को छोड़कर भी हो सकता है में:

मैं इस तरह एक कोड है। उदाहरण के लिए NullReferenceException की तरह। मुझे कैसे पता चलेगा कि किस ऑब्जेक्ट ने अपवाद का कारण बना दिया है, इसलिए मुझे पता चलेगा कि पकड़ में क्या करना है और ग्राहक को क्या करना है?

+0

आपको यह उत्तर और इसमें प्रासंगिक लिंक मिल सकते हैं: http://stackoverflow.com/a/7152374/625332 – Dmitry

उत्तर

9

सामान्य रूप से, आपको किसी भी अपवादों को पकड़ना नहीं चाहिए।

मुझे पता है कि यह अजीब लगता है, लेकिन तथ्य यह है कि आपको केवल उन अपवादों को पकड़ना चाहिए जो आप वास्तव में कर सकते हैं, और आप आमतौर पर अपवादों के बारे में कुछ भी नहीं कर सकते हैं।

इस नियम के "अपवाद" को अपवाद को "संभाल" करने का क्या अर्थ है, इसके साथ क्या करना है। कुछ अनुप्रयोगों में, अपवाद को "हैंडलिंग" का अर्थ लॉग इन करना है। दूसरों में (उदाहरण के लिए एएसपी.नेट), अपवाद को संभालने के लिए बेहतर है, क्योंकि ढांचे (इस मामले में एएसपी.नेट स्वास्थ्य निगरानी) आपके लिए लॉग इन करेगा।

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

एक बहु स्तरीय आवेदन में, एक स्तरीय सीमाओं पर अपवाद आ सकता है, तो एक नया, स्तरीय विशेष अपवाद rethrow:

try 
{ 
    // ... 
} 
catch (Exception ex) 
{ 
    throw new TierException("Some message", ex); 
} 

एक और उपयोग के मामले अपवाद को पकड़ने के लिए है, तो कोई नया अपवाद फेंक उस में अधिक जानकारी के साथ:

public int GetValueFromConfigurationFile(...) 
{ 
    const string configFileName = "..."; 
    try 
    { 
     // ... 
    } 
    catch (FileNotFoundException fEx) 
    { 
     throw new InvalidOperationException(
      String.Format("Can't find configuration file {0}", configFileName), 
      fEx); 
    } 
} 

इस मामले में, आप एक विशिष्ट अपवाद (FileNotFoundException) को पकड़ने, और वे अन्यथा पता नहीं कर सके अपने कॉलर जानकारी प्रदान कर रहे हैं: कि नहीं मिला फ़ाइल एक विन्यास फाइल था।

सामान्य संदेश है: - केवल अपवाद क्या आप जानते हैं को संभालने के लिए कैसे पकड़ने - हमेशा भीतरी अपवाद है जब कोई नया अपवाद बनाने, अपवाद की श्रृंखला को बचाने के लिये शामिल हैं - - सबसे विशिष्ट अपवाद संभव पकड़ो rethrow करने के लिए वर्तमान अपवाद, throw; का उपयोग करें, throw ex;

कुछ और हैं, और मैं आपको Microsoft Framework Design दिशानिर्देशों से संदर्भ ढूंढने का प्रयास करूंगा।

पीएस अगर कोई सवाल पा सकता है तो यह एक डुप्लिकेट है, डुप्लिकेट के रूप में बंद करने के लिए स्वतंत्र महसूस करें। मुझे इससे कोई प्रतिनिधि खोने में कोई फर्क नहीं पड़ता। मैं सिर्फ डुप्लिकेट नहीं मिला।


मैं होना चाहिए बस के लिए लिंक पोस्ट "अपवाद हैंडलिंग" tag wiki, जहां यह कहते हैं:

हालांकि, .नेट कार्यक्रमों के संदर्भ में अपवाद हैंडलिंग के लिए, "Design Guidelines for Exceptions देखना "।

+0

यह उत्तर मेरे मोजे चट्टानों को चट्टान करता है। – CptSupermrkt

+0

धन्यवाद, लेकिन यह वास्तव में _my_ उत्तर नहीं है। मुझे सिर्फ लिंक ढूंढना है। –

1

हालांकि WCF ग्राहक के लिए के माध्यम से सर्वर अपवाद पारित करने के लिए तंत्र है यह शायद पर विचार के लायक है अपने ग्राहक उपयोगकर्ता वास्तव में उनके चेहरे में आम तौर पर जटिल सर्वर साइड अपवादों को देखने के लिए चाहता है।
सर्वर साइड एक्सपेक्शन का पता लगाने के लिए सामान्य रूप से बेहतर - और यदि आप उस दूरस्थ रूप से उस तक पहुंच चाहते हैं तो रिमोट ट्रेसिंग लॉगर का उपयोग करें। या सर्वर सर्वर अपवाद क्लाइंट पक्ष को एक अविभाज्य फैशन में लॉग इन करने के लिए अपने सर्वर पर एक टेक्स्ट ट्रेस एपीआई है।

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