好吧,问题的标题说明了一切。
在介绍代码之前,我有几点要说明:
- 如果我知道特定类型的异常发生在特定的语句集中,那么将它们全部放在单个 try 中立即放置相应的 catch 是一种好习惯吗?
或者我应该将所有容易发生异常的代码放在单个代码块中,并在单次尝试之后放置所有相应的 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){ } }
那么上面的方法是好还是低于一个
{
try
{
exec(); //can cause ExceptionXYZ
exec(); // can cause ExceptionPQR
exec(); //can cause ExceptionABC
}
catch(ExceptionXYZ e){ }
catch(ExceptionPQR e){ }
catch(ExceptionABC e){ }
}
也有可能混合上述两种模式,比如在 try 中嵌套 try。 关于何时使用的任何其他注意事项/要点?有一件事是肯定嵌套会使代码复杂一点。
在其他场景中还有一些其他注意事项(嵌套在 finally 块下),例如在关闭数据库 JDBC 资源时,我们必须独立处理每次关闭,以确保一次 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() 减少失败:如果我们确定某些语句集会导致特定的异常集,我们应该将这些代码行放入仅处理相应异常的尝试中,而不是将其放在外部尝试之后。因此,上述第三种情况(混合模式)可能是合适的一种:
{ try { exec(); //can cause ExceptionXYZ } catch(ExceptionABC){ } catch(ExceptionPQR){ } catch(ExceptionXYZ){ } }
上面的效率可能比
{
try
{
try
{
exec(); //can cause ExceptionXYZ
}
catch(ExceptionXYZ){ }
}
catch(ExceptionABC){ }
catch(ExceptionPQR){ }
}