2012-05-20 7 views
38

Ich habe Code, den ich ausführen möchte, wenn eine Ausnahme auftritt. Aber dieser Code kann auch eine Ausnahme erzeugen. Aber ich habe noch nie gesehen, dass Leute versuchen/fangen in einem anderen Versuch/Fang.Java - ist es eine schlechte Übung, einen Versuch/Fang in einem Versuch/Fang zu versuchen?

Ist das, was ich schlechte Praxis mache und vielleicht gibt es einen besseren Weg, dies zu tun:

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       
    } 
} 

Es Art von umständlich erscheint. Gibt es etwas, das falsch sein könnte?

+3

Sie könnten den Code in den catch-Block in seiner eigenen Methode setzen. –

+0

@HunterMcMillen guten Punkt. :) – GeekedOut

Antwort

32

Es ist in Ordnung, obwohl, wenn Ihre Ausnahmebehandlungslogik so komplex ist, Sie in Betracht ziehen könnten, sie in ihre eigene Funktion zu zerlegen.

9

Es ist eine schlechte Praxis, Code mit so vielen Verschachtelungsebenen zu schreiben, besonders in try-catch - also würde ich sagen: vermeiden. Auf der anderen Seite werfen eine Ausnahme von catch Block ist unverzeihlich Sünde, so sollten Sie sehr vorsichtig sein.

Mein Rat - extrahieren Ihre catch Logik in einem Verfahren (so catch Block ist einfach) und stellen Sie sicher, dass diese Methode nie etwas werfen:

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      
    } 
} 

Auch scheint es (ich könnte falsch sein), dass Sie verwenden Ausnahmen, um den Programmablauf zu steuern. Berücksichtigen Sie den Standard-Rückgabewert, wenn ActivityNotFoundException keine Ausnahme Situation ist, aber das kann unter normalen Umständen passieren. Hier

+0

danke ... warum sagst du eine Ausnahme in einem Versuch zu werfen ist eine Sünde? :) – GeekedOut

+1

"So viele Ebenen?" Ich sehe eine Gesamtsumme von drei. Seine Logik im 'catch' Block ist nicht tiefer als ein' if' Block in seinem 'try' Block. –

+0

Das Problem, das ich bei der Aufschlüsselung sah, ist, dass ich nicht weiß, wie ich prüfen soll, ob die Ausnahme passieren wird oder nicht, da ich versuche, zu einer externen URL zu gehen. – GeekedOut

3

Antwort ist No..It 100% in Ordnung ist .. Sie könnten viel davon in JDBC und IO verwenden, weil sie viele Ausnahmen haben gehandhabt werden, einander im Inneren ...

0

ist alternative Lösung, wenn Sie verschachtelte try und catch nicht tun es verwenden möchten, können Sie auch wie folgt aus:

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

Testmethode geht hier:

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; 
    } 
} 

Nun ist die setzen Restcode in 2. Methode:

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

In Java und in vielen anderen Programmiersprachen können Sie die gleiche bedingte Logik auf viele verschiedene Arten schreiben. Die Frage ist, warum Ihre Methode besser, effektiver oder optimaler ist, als einfach den zweiten Versuch/Fang in den Catch-Block des ersten Versuchs/Fangs zu schreiben. – Bloodysock

Verwandte Themen