2012-05-20 10 views
38

मेरे पास कुछ कोड है जो अपवाद होने पर मैं निष्पादित करना चाहता हूं। लेकिन वह कोड भी अपवाद उत्पन्न कर सकता है। लेकिन मैंने कभी नहीं देखा है कि लोग किसी अन्य कोशिश/पकड़ के अंदर कोशिश/पकड़ लें।जावा - क्या कोशिश/पकड़ के अंदर कोशिश/पकड़ करने का बुरा अभ्यास है?

मैं गरीब अभ्यास क्या कर रहा हूँ है और हो सकता है वहाँ ऐसा करने का एक बेहतर तरीका है:

Uri uri = Uri.parse("some url"); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 

try 
{ 
    startActivity(intent); 
} 
catch (ActivityNotFoundException anfe) 
{ 
    // Make some alert to me 

    // Now try to redirect them to the web version: 
    Uri weburi = Uri.parse("some url"); 
    try 
    { 
     Intent webintent = new Intent(Intent.ACTION_VIEW, weburi); 
     startActivity(webintent); 
    } 
    catch (Exception e) 
    { 
     // Make some alert to me       
    } 
} 

यह अजीब की तरह लगता है। क्या ऐसा कुछ है जो इसके साथ गलत हो सकता है?

+3

आप कोड को अपने तरीके से कैच ब्लॉक में डाल सकते हैं। –

+0

@HunterMcMillen अच्छा बिंदु। :) – GeekedOut

उत्तर

32

यह ठीक है, हालांकि यदि आपका अपवाद हैंडलिंग तर्क जटिल है, तो आप इसे अपने स्वयं के कार्य में तोड़ने पर विचार कर सकते हैं।

9

घोंसले के इतने सारे स्तरों के साथ कोड लिखना एक बुरा अभ्यास है, खासकर try-catch में - तो मैं कहूंगा: इससे बचें। दूसरी तरफ catch ब्लॉक से अपवाद फेंकना अक्षम्य पाप है, इसलिए आपको बहुत सावधान रहना चाहिए।

मेरी सलाह - एक विधि में अपने catch तर्क निकालने (ताकि catch ब्लॉक सरल है) और यकीन है कि यह विधि कुछ भी फेंक कभी नहीं होगा बनाने:

Uri uri = Uri.parse("some url"); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 

try 
{ 
    startActivity(intent); 
} 
catch (ActivityNotFoundException anfe) 
{ 
    // Make some alert to me 

    // Now try to redirect them to the web version: 
    Uri weburi = Uri.parse("some url"); 
    Intent webintent = new Intent(Intent.ACTION_VIEW, weburi); 
    silentStartActivity(webintent) 
} 

//... 

private void silentStartActivity(Intent intent) { 
    try 
    { 
     startActivity(webintent); 
    } 
    catch (Exception e) 
    { 
     // Make some alert to me      
    } 
} 

भी ऐसा लगता है (मैं गलत हो सकता है) आप प्रोग्राम प्रवाह को नियंत्रित करने के लिए अपवादों का उपयोग कर रहे हैं। ActivityNotFoundException फेंकने पर मानक रिटर्न वैल्यू पर विचार करें असाधारण स्थिति नहीं है लेकिन यह सामान्य परिस्थितियों में हो सकती है।

+0

धन्यवाद ... आप क्यों कहते हैं कि कोशिश/पकड़ में अपवाद फेंकना पाप है? :) – GeekedOut

+1

"इतने सारे स्तर?" मैं तीनों की कुल मिलाकर देखता हूं। 'पकड़' ब्लॉक में उनका तर्क उनके 'प्रयास' ब्लॉक में 'अगर' ब्लॉक से गहरा नहीं है। –

+0

जिस समस्या को मैंने इसे तोड़ने के साथ देखा वह यह है कि मुझे नहीं पता कि अपवाद होगा या नहीं, क्योंकि मैं बाहरी यूआरएल पर जाने की कोशिश कर रहा हूं। – GeekedOut

3

उत्तर No..It 100% ठीक .. तुम क्योंकि वे अपवाद के बहुत कुछ है, नियंत्रित किया जा करने के लिए एक और अंदर एक JDBC और आईओ में इनमें से बहुत उपयोग करने के लिए हो सकता है, है

0

यहाँ है ...

boolean flag = false; 
void test(); 
if(flag) 
    { 
    test2(); 
    } 

टेस्ट विधि यहाँ जाता है:

private void test(){ 
    try { 
     Uri uri = Uri.parse("some url"); 
     Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
     startActivity(intent); 
    }catch (ActivityNotFoundException anfe){ 
     System.out.println(anfe); 
     flag =true; 
    } 
} 

अब डाल वैकल्पिक समाधान यदि आप उपयोग करने के लिए नेस्टेड ट्राई एवं कैच, आप भी इस तरह यह कर सकते हैं नहीं करना चाहती है दूसरे कोड में शेष कोड:

public void test2(){ 
    Uri weburi = Uri.parse("some url"); 
     try 
     { 
      Intent webintent = new Intent(Intent.ACTION_VIEW, weburi); 
      startActivity(webintent); 
     } 
     catch (Exception e) 
     { 
      // Make some alert to me      
     } 
+0

जावा में, और कई अन्य प्रोग्रामिंग भाषाओं में, आप एक ही सशर्त तर्क को कई अलग-अलग तरीकों से लिख सकते हैं। सवाल यह है कि आपको क्यों लगता है कि आपकी विधि पहले प्रयास/पकड़ के पकड़ ब्लॉक में दूसरी कोशिश/पकड़ लिखने से बेहतर, अधिक प्रभावी या अधिक अनुकूल है। – Bloodysock