さて、質問のタイトルはそれをすべて言います。
コードを提示する前に、いくつかのポイントがあります。
- 特定の種類の例外が特定のステートメントのセットで発生することがわかっている場合、それらすべてを1回の試行で、対応するcatchをすぐに配置することをお勧めしますか?
または、例外が発生しやすいすべてのコードを1つのコードブロックに配置し、その1回の試行後に対応するすべてのcatchブロックを配置する必要があります。それに関連するパフォーマンスコストはありますか?
{ try { exec();//can cause ExceptionXYZ } catch(ExceptionXYZ e){ } try { exec(); //can cause ExceptionPQR } catch(ExceptionPQR e){ } try { exec(); //can cause ExceptionABC } catch(ExceptionABC e){ } }
それで、上記の方法は良いですか、それとも1つ以下ですか
{
try
{
exec(); //can cause ExceptionXYZ
exec(); // can cause ExceptionPQR
exec(); //can cause ExceptionABC
}
catch(ExceptionXYZ e){ }
catch(ExceptionPQR e){ }
catch(ExceptionABC e){ }
}
また、 try in tryのネストのように、上記の2つのパターンが混在する可能性もあります。 いつ使用するかについての他の考慮事項/ポイントはありますか?1つは、ネストによってコードが少し複雑になることです。
データベースを閉じるときのような他のシナリオでは、他にもいくつかの考慮事項があります-JDBCリソースでは、1つのclose()でNullPointerExceptionが他のリソースを開いたままにしないようにするために、すべてのクローズを個別に処理する必要があります。
try
{ }
catch(Exception e)
{ }
finally
{
if (rs != null) //ResultSet
try
{
rs.close();
}
catch(SQLException se1)
{
se1.printStackTrace();
}
if(pstmt!=null) //PreparedStatement
try
{
pstmt.close();
}
catch(SQLException se2)
{
se2.printStackTrace();
}
if(conn!=null) //Connection
try
{
conn.close();
}
catch (SQLException se3)
{
se3.printStackTrace();
}
}
何かご意見は?または、不必要に考えすぎています。
編集
いくつかの考慮事項/事実(考えすぎ:p)
一般化するだけです。いずれにせよ実行する必要のあるコードブロックがいくつかある場合は、それらを別々のtry-catchに配置する必要があり、これらのcatchブロックからの他のコードで例外が発生することはありません。
{ try { mustexec(); } catch(){ } noexceptionexec(); try { mustexec(); } catch() { } }
catch()のフォールスルーを最小限に抑える:ステートメントのセットが特定のExceptionのセットを引き起こす可能性があることが確実な場合は、外部試行の後に配置するのではなく、対応するExceptionのみを処理するようにそれらのコード行を配置する必要があります。したがって、上記の3番目のケース(混合パターン)が適切なケースになります。
{ try { exec(); //can cause ExceptionXYZ } catch(ExceptionABC){ } catch(ExceptionPQR){ } catch(ExceptionXYZ){ } }
上記は少し非効率的かもしれません
{
try
{
try
{
exec(); //can cause ExceptionXYZ
}
catch(ExceptionXYZ){ }
}
catch(ExceptionABC){ }
catch(ExceptionPQR){ }
}