it-swarm.com.de

Java - ist es schlechte Praxis, Try/Catch zu versuchen?

Ich habe Code, den ich ausführen möchte, wenn eine Ausnahme auftritt. Dieser Code kann jedoch auch eine Ausnahme generieren. Aber ich habe noch nie Leute gesehen, die einen Try/Catch in einem anderen Try/Catch machen.

Was mache ich schlecht? 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 scheint irgendwie unbeholfen. Gibt es etwas, das möglicherweise nicht stimmt?

44
GeekedOut

Es ist in Ordnung, auch wenn Ihre Ausnahmebehandlungslogik so komplex ist, können Sie sie in ihre eigene Funktion aufteilen.

37
T.J. Crowder

Es ist eine schlechte Praxis, Code mit so vielen Verschachtelungsstufen zu schreiben, vor allem in try-catch - also würde ich sagen: meiden. Andererseits ist das Auslösen einer Ausnahme aus dem catch-Block eine unverzeihliche Sünde, daher sollten Sie sehr vorsichtig sein.

Mein Rat - extrahieren Sie Ihre catch-Logik in eine Methode (der catch-Block ist einfach), und stellen Sie sicher, dass diese Methode niemals irgendetwas auslöst:

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

Es scheint auch (ich könnte mich irren), dass Sie Ausnahmen verwenden, um den Programmfluss zu steuern. Berücksichtigen Sie den Standard-Rückgabewert, wenn ActivityNotFoundException keine außergewöhnliche Situation ist, aber es kann unter normalen Umständen vorkommen.

10

Antwort ist Nein. Es ist 100% in Ordnung. Möglicherweise müssen Sie viele davon in JDBC und IO verwenden, da sie viele Ausnahmen haben, die in einem anderen verarbeitet werden müssen.

3
PeakGen

Hier ist eine alternative Lösung, wenn Sie nicht verschachteltes try and catch verwenden möchten, Sie können es auch so machen:

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

Geben Sie nun den Restcode in die 2. Methode ein:

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
Novice