java - 多重 - try catch 複数 php




同じcatch節で複数のJava例外を捕捉できますか? (6)

Javaでは、私はこのようなことをしたい:

try {
    ...     
} catch (/* code to catch IllegalArgumentException, SecurityException, 
            IllegalAccessException, and NoSuchFieldException at the same time */) {
   someCode();
}

...の代わりに:

try {
    ...     
} catch (IllegalArgumentException e) {
    someCode();
} catch (SecurityException e) {
    someCode();
} catch (IllegalAccessException e) {
    someCode();
} catch (NoSuchFieldException e) {
    someCode();
}

これを行う方法はありますか?


7歳以前はどうですか?

  Boolean   caught = true;
  Exception e;
  try {
     ...
     caught = false;
  } catch (TransformerException te) {
     e = te;
  } catch (SocketException se) {
     e = se;
  } catch (IOException ie) {
     e = ie;
  }
  if (caught) {
     someCode(); // You can reference Exception e here.
  }

Java 6(つまりAndroid)でのuser454322の答えの代わりに、クリーナー(ただし、冗長ではなく、おそらく好まれない)は、すべてのExceptionを捕捉してRuntimeExceptionを再実行することRuntimeException 。 これはスタックの上にある他のタイプの例外を捕まえることを計画している場合(スタックを再スローしない限り)、 チェックされたすべての例外を効果的にキャッチします

例えば:

try {
    // CODE THAT THROWS EXCEPTION
} catch (Exception e) {
    if (e instanceof RuntimeException) {
        // this exception was not expected, so re-throw it
        throw e;
    } else {
        // YOUR CODE FOR ALL CHECKED EXCEPTIONS
    } 
}

言い換えれば、冗長性のために、ブール値やその他の変数を設定し、それに基づいてtry-catchブロックの後にいくつかのコードを実行するのが最善の方法かもしれません。


Java 7の直前ではありませんが、私は次のようにします:

Java 6以前

try {
  //.....
} catch (Exception exc) {
  if (exc instanceof IllegalArgumentException || exc instanceof SecurityException || 
     exc instanceof IllegalAccessException || exc instanceof NoSuchFieldException ) {

     someCode();

  } else if (exc instanceof RuntimeException) {
     throw (RuntimeException) exc;     

  } else {
    throw new RuntimeException(exc);
  }

}



Java 7

try {
  //.....
} catch ( IllegalArgumentException | SecurityException |
         IllegalAccessException |NoSuchFieldException exc) {
  someCode();
}

いいえ、1カスタマーにつき1つです。

どのような場合でも同じアクションを取る限り、java.lang.Exceptionのようなスーパークラスをキャッチすることができます。

try {
    // some code
} catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception
    e.printStackTrace();
}

しかしそれはベストプラクティスではないかもしれません。 実際に処理するための戦略がある場合にのみ例外をキャッチする必要があります。ロギングと再スローガンは「処理」ではありません。 是正措置を講じていない場合は、それをメソッドの署名に追加し、状況に対処できる人に泡立ててください。


はい。 パイプ(|)区切り記号を使用する方法は次のとおりです。

try
{
    .......
}    
catch
{
    catch(IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e)
}

例外の階層がある場合は、基本クラスを使用して例外のすべてのサブクラスをキャッチできます。 縮退した場合、次のようにしてすべての Java例外をキャッチできます。

try {
   ...
} catch (Exception e) {
   someCode();
}

より一般的なケースでは、RepositoryExceptionが基本クラスでPathNotFoundExceptionが派生クラスである場合は、次のようになります。

try {
   ...
} catch (RepositoryException re) {
   someCode();
} catch (Exception e) {
   someCode();
}

上記のコードは、ReceptionExceptionとPathNotFoundExceptionを捕捉して、ある種の例外処理を行い、他のすべての例外は一括して処理します。 上記の@OscarRyzの回答によると、Java 7以降:

try { 
  ...
} catch( IOException | SQLException ex ) { 
  ...
}




multi-catch