Java est-il une mauvaise pratique de faire un try/catch à l'intérieur d'un try/catch?

j'ai un code que je veux exécuter si une exception se produit. Mais ce code peut aussi générer une exception. Mais je n'ai jamais vu des gens faire un try/catch à l'intérieur d'un autre try/catch.

Est ce que je fais une mauvaise pratique et peut-être il ya une meilleure façon de faire ceci:

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

Il semble un peu maladroite. Est-il quelque chose qui pourrait être mal avec lui?

44
demandé sur ROMANIA_engineer 2012-05-20 18:54:56

4 réponses

c'est très bien, bien que si votre logique de gestion d'exception est aussi complexe, vous pourriez envisager de la décomposer en fonction.

34
répondu T.J. Crowder 2012-05-20 14:57:10

c'est une mauvaise pratique d'écrire du code avec autant de niveaux de nichage, surtout dans try-catch - donc je dirais: éviter. d'autre part Jeter une exception de catch le blocage est un péché impardonnable, donc vous devriez être très prudent.

mon conseil - extraire votre catch logique dans une méthode (donc catch block est simple) et assurez-vous que cette méthode ne lancera 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                     
    }
}

il semble aussi (je pourrais me tromper) que vous utilisez des exceptions pour contrôle du flux du programme. Envisager standard valeur de retour si jetant ActivityNotFoundException n'est pas exceptionnel mais cela peut se produire dans des circonstances normales.

10
répondu Tomasz Nurkiewicz 2012-05-20 15:12:18

réponse est non..il est 100% amende.. Vous pourriez avoir à utiliser beaucoup de ces JDBC et IO, parce qu'ils ont beaucoup d'exceptions à traiter, l'un dans l'autre...

3
répondu Yohan Weerasinghe 2012-05-20 15:04:06

Voici une solution alternative si vous ne voulez pas utiliser imbriqué essayer et attraper, Vous pouvez aussi faire comme ceci:

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

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 2e 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
répondu Novice 2017-11-06 14:05:04