2008-11-11 14 views
10

मैं इस तरह की कोशिश पकड़ के साथ कोड के आसपास के साथ ऊब रहा हूँ ..कोशिश पकड़ने से कैसे छुटकारा पाएं?

try 
{ 
    //some boring stuff 
} 
catch(Exception ex) 
{ 
    //something even more boring stuff 
} 

मैं

SurroundWithTryCatch(MyMethod) 

की तरह कुछ करना चाहते हैं मैं जानता हूँ कि मैं सही हस्ताक्षर के साथ एक प्रतिनिधि बनाकर इस व्यवहार को पूरा कर सकते समारोह के, लेकिन मेरे आवेदन में सभी विधियों के लिए एक प्रतिनिधि बनाना यह सिर्फ एक विकल्प नहीं है।

मैं आईएल कोड इंजेक्शन करके भी ऐसा कर सकता हूं लेकिन यह प्रदर्शन के मामले में महंगा है क्योंकि यह मेरे चारों ओर एक रैपर असेंबली बनाता है।

कोई अन्य मान्य विचारधारा?

उत्तर

23

सबसे पहले, ऐसा लगता है कि आप अक्सर कोशिश/पकड़ का उपयोग कर सकते हैं - खासकर अगर आप Exception पकड़ रहे हैं। प्रयास/पकड़ ब्लॉक अपेक्षाकृत दुर्लभ होना चाहिए; जब तक आप वास्तव में अपवाद को "संभाल" नहीं सकते हैं, तो आपको इसे स्टैक की अगली परत तक बुलबुला करना चाहिए।

अब, आपको लगता है कि आप वास्तव में चाहते हैं कि ये सभी प्रयास/पकड़ ब्लॉक हैं, यह प्रतिनिधि बनाने का विकल्प क्यों नहीं है? अज्ञात विधियों और लैम्ब्डा अभिव्यक्तियों के साथ-साथ System नामस्थान में Func/Action प्रतिनिधियों के साथ, मूल रूप से करने के लिए बहुत कम काम है। आप लिखते हैं:

public void SurroundWithTryCatch(Action action) 
{ 
    try 
    { 
     action(); 
    } 
    catch(Exception ex) 
    { 
     //something even more boring stuff 
    }  
} 

और फिर अपने SurroundWithTryCatch(MyMethod) तरीके से कार्य करेंगे, अगर यह कोई paramaters लेता है।

वैकल्पिक रूप से, अगर आप एक अलग विधि कॉल नहीं करना चाहते, बस लिखना:

public void MyMethod() 
{ 
    SurroundWithTryCatch(() => 
    { 
     // Logic here 
    }); 
} 

आप विधि से वापस जाने के लिए की जरूरत है, तो आप कर सकते हैं:

public int MyMethod() 
{ 
    return SurroundWithTryCatch(() => 
    { 
     // Logic here 
     return 5; 
    }); 
} 

SurroundWithTryCatch के जेनेरिक अधिभार के साथ:

public T SurroundWithTryCatch<T>(Func<T> func) 
{  
    try 
    { 
     return func(); 
    } 
    catch(Exception ex) 
    { 
     //something even more boring stuff 
    }  
} 

इनमें से अधिकांश सी # 2 में भी ठीक होंगे, लेकिन टाइप अनुमान आपको उतना ही मदद नहीं करेगा और आपको लैम्ब्डा अभिव्यक्तियों के बजाय अनाम विधियों का उपयोग करना होगा।

हालांकि शुरुआत में वापस जाने के लिए: कम बार कोशिश/पकड़ने का प्रयास करें। (कोशिश करें/अंततः अधिक बार होना चाहिए, हालांकि आमतौर पर उपयोग कथन के रूप में लिखा जाता है।)

+0

@ जोन आह तुमने मुझे मार दिया यह..आम आप;) –

3

आप इसके बजाय कुछ शून्य सत्यापन का उपयोग करने का प्रयास कर सकते हैं। मैं एसक्यूएल उदाहरण के लिए एक LINQ ले जा सकते हैं:

var user = db.Users.SingleOrDefault(u => u.Username == 3); 

if (user == null) 
    throw new ArgumentNullException("User", "User cannot be null."); 

// "else" continue your code... 
+0

वास्तव में आपको कभी भी 'NullReferenceException' नहीं फेंकना चाहिए। यह रनटाइम के लिए आरक्षित है। आप कोशिश कर सकते हैं हालांकि 'ArgumentNullException' –

+0

क्षमा करें। मैंने लिखा है कि जल्दी में। मैं इसे तुरंत बदल दूंगा। Thanx :) – stiduck

2

शायद आप किसी दूसरे वाक्य रचना के माध्यम से त्रुटि कोड के रूप में अपवाद हैंडलिंग इलाज कर रहे हैं? तो कोशिश मत करो/पकड़ो। अपवाद को ऊपर की ओर फैलाने दें।

0

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

ExceptionCatcher.catchAll(new Runnable() { 
    public void run() { 
    //run delegate here 
    MyMethod(); 
    } 
}); 

और मोहक() सिर्फ runnable और इसके चारों ओर एक कोशिश पकड़ ब्लॉक लपेटकर कॉल करेंगे।

हालांकि, मुझे लगता है कि आप वास्तव में क्या चाहते हैं वह भाषा है जो closure support अच्छा है। बंद करने का उपयोग करना, जो भी आप चाहते हैं वह करना बेहद आसान है।

+0

सौभाग्य से, सी # * * अच्छा बंद समर्थन वाला एक भाषा है :) (प्रश्न भाषा नहीं बताता है, लेकिन इसे कोड द्वारा अनुमानित किया जा सकता है और आईएल और प्रतिनिधियों का उल्लेख किया जा सकता है।) –

2

मेरे लिए ऐसा लगता है कि आप पहलू उन्मुख प्रोग्रामिंग के लिए पूछ रहे हैं। मुझे लगता है कि आपको पोस्टशर्प पर एक नज़र रखना चाहिए।

+0

धन्यवाद, मुझे लगता है कि मैं यही चाहता था, क्या आपने इस दृष्टिकोण का उत्पादन कोड में उपयोग किया है? –

4

पहलू ओरिएंटेड प्रोग्रामिंग भी आपकी मदद कर सकती है, लेकिन इसके लिए आपको अपनी परियोजना में पुस्तकालयों को जोड़ने की आवश्यकता हो सकती है, postsharp इस मामले में आपकी सहायता करेगा। यह लिंक देखें http://doc.postsharp.org/1.0/index.html#http://doc.postsharp.org/1.0/UserGuide/Laos/AspectKinds/OnExceptionAspect.html#idHelpTOCNode650988000

+0

हे, यह वही है जो मैं चाहता था, क्या आपके पास इसका कोई अनुभव है? क्या आप क्लासिक तरीके के बजाय इसका उपयोग करने की सलाह देंगे? –

+0

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

0

यदि आप जावा का उपयोग कर रहे हैं, तो आपके पास RuntimeExceptions हैं, जो अपवाद हैं जिसका अर्थ है कि कुछ गलत हो गया है, जिससे आप से पुनर्प्राप्त होने की उम्मीद नहीं की जा सकती है। इसे देखो। यहां प्रारंभ करें: http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html

उदाहरण के लिए, वसंत की डेटा एक्सेस बिट्स चीजें गलत होने पर विभिन्न रनटाइम अपवादों को फेंक देती हैं। उनके साथ व्यवहार वैकल्पिक है।

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