web-dev-qa-db-ja.com

Java-try / catch内でtry / catchを実行するのは悪い習慣ですか?

例外が発生した場合に実行するコードがいくつかあります。しかし、そのコードは例外を生成することもあります。しかし、他のtry/catchの中でtry/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");
     try
     {
         Intent webintent = new Intent(Intent.ACTION_VIEW, weburi);
         startActivity(webintent);
     }
     catch ( Exception e )
     {
         // Make some alert to me                        
     }
 }

ちょっとぎこちないようです。それと間違っているかもしれない何かがありますか?

48
GeekedOut

例外処理ロジックが非常に複雑な場合は、それを独自の関数に分割することを検討することもできますが、問題ありません。

40
T.J. Crowder

特に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のスローが例外の状況ではないが、通常の状況下で発生する可能性がある場合は、標準の戻り値を考慮してください。

11

答えはノーです。100%すばらしいです。JDBCとIOでこれらの多くを使用する必要があるかもしれません。

4
PeakGen

ネストされたtry and catchを使用したくない場合の代替ソリューションは次のとおりです。次のようにすることもできます。

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

次に、残りのコードを2番目のメソッドに配置します。

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