web-dev-qa-db-fra.com

Java - est-ce une mauvaise pratique d'essayer/attraper un essai/attraper?

J'ai du code que je veux exécuter si une exception se produit. Mais ce code peut également générer une exception. Mais je n'ai jamais vu des gens faire un essai/attraper dans un autre essai/attraper.

C’est ce que je pratique mal et il existe peut-être une meilleure façon de le faire:

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

Cela semble un peu gênant. Y a-t-il quelque chose qui ne va pas?

44
GeekedOut

C'est bien, mais si votre logique de traitement des exceptions est aussi complexe, vous pouvez envisager de la diviser en une fonction distincte.

37
T.J. Crowder

C'est une mauvaise pratique d'écrire du code avec autant de niveaux d'imbrication, en particulier dans try-catch - alors je dirais: évitez. D'autre part, lancer une exception du bloc catch est un péché impardonnable, vous devez donc être très prudent.

Mon conseil - extrayez votre logique catch dans une méthode (le bloc catch est donc simple) et assurez-vous que cette méthode ne jettera jamais rien:

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

En outre, il semble (je me trompe peut-être) que vous utilisez des exceptions pour contrôler le déroulement du programme. Considérez la valeur de retour standard si lancer ActivityNotFoundException n'est pas une situation exceptionnelle / mais cela peut arriver dans des circonstances normales.

10

La réponse est non. C'est parfait à 100%. Vous devrez peut-être en utiliser beaucoup dans JDBC et IO, car ils ont beaucoup d'exceptions à gérer, l'une dans l'autre ...

3
PeakGen

Voici une solution alternative si vous ne voulez pas utiliser try et catch imbriqués, Vous pouvez aussi le faire comme ça:

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

La méthode de test va ici:

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

Maintenant, mettez le code de repos dans la 2ème méthode:

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