Mah*_*aha 4 java design-patterns exception-handling
那么问题的标题就是这么说的.
在我提出代码之前,我有一些要点:
或者我应该将所有容易出错的代码放在单个代码块中,并在单次尝试后放置所有相应的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){ }
}
Run Code Online (Sandbox Code Playgroud)所以上述方式是好还是低于一
{
try
{
exec(); //can cause ExceptionXYZ
exec(); // can cause ExceptionPQR
exec(); //can cause ExceptionABC
}
catch(ExceptionXYZ e){ }
catch(ExceptionPQR e){ }
catch(ExceptionABC e){ }
}
Run Code Online (Sandbox Code Playgroud)
也有可能混合以上两种模式,如嵌套尝试尝试. 关于何时使用的任何其他注意事项/要点?有一件事是确保嵌套使代码复杂化了一点.
在其他场景中还有一些其他注意事项(在finally块下嵌套),例如关闭数据库-Jindows资源时,我们必须独立处理每个关闭,以确保一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?或者我只是不加思索地过度思考.
编辑
一些更多的考虑/事实(过度思考:p)
只是概括一下:如果总有一些代码块在任何情况下都需要执行,那么我们应该把它们放在单独的try-catch上,这些catch块中的任何其他代码不应该导致任何异常:
{
try
{
mustexec();
}
catch(){ }
noexceptionexec();
try
{
mustexec();
}
catch() { }
}
Run Code Online (Sandbox Code Playgroud)通过catch()确保最小值:如果我们确定某些语句集可以导致一组特定的Exception,我们应该将这些代码行放在try中,只处理相应的Exception,而不是在外部try之后放置它.所以第三种情况(混合模式)可以是合适的:
{
try
{
exec(); //can cause ExceptionXYZ
}
catch(ExceptionABC){ }
catch(ExceptionPQR){ }
catch(ExceptionXYZ){ }
}
Run Code Online (Sandbox Code Playgroud)上面可能有点无效
{
try
{
try
{
exec(); //can cause ExceptionXYZ
}
catch(ExceptionXYZ){ }
}
catch(ExceptionABC){ }
catch(ExceptionPQR){ }
}
Run Code Online (Sandbox Code Playgroud)
Code1和Code2不相同.
try{
exec1();
exec2(); // if exec1 fails, it is not executed
}catch(){}
try{
exec1();
}catch(){}
try{
exec2(); // if exec1 fails, it is executed
}catch(){}
Run Code Online (Sandbox Code Playgroud)
对于point3是的.你可以混合你的代码.