这种try-catch嵌套是否优先 - 任何性能成本?

Mah*_*aha 4 java design-patterns exception-handling

那么问题的标题就是这么说的.

在我提出代码之前,我有一些要点:

  • 如果我知道特定类型的语句中出现了特定类型的异常,那么将它们全部放入单个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){ }
    }
    
    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)

Gab*_*tti 7

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是的.你可以混合你的代码.