gpt4 book ai didi

java - 这种 try-catch 嵌套是否可取 - 任何性能成本?

转载 作者:搜寻专家 更新时间:2023-11-01 01:13:33 25 4
gpt4 key购买 nike

好吧,问题的标题说明了一切。

在展示代码之前我有几点要说明:

  • 如果我知道在特定的一组语句中会发生特定类型的异常,那么将它们全部放在一个 try 中立即放入相应的 catch 是否是一种好的做法?
  • 或者我应该将所有容易出现异常的代码放在一个代码块中,并在该单次尝试后放置所有相应的 catch block 。是否有任何相关的性能成本?

    {   
    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关于何时使用的任何其他注意事项/要点?有一件事是肯定的嵌套会使代码复杂一点。

在关闭数据库-JDBC 资源等其他场景中(在嵌套在 finally block 下)还有一些其他考虑因素,其中我们必须独立处理每个关闭,以确保在一次关闭中出现 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 block 不应导致任何异常:

    {
    try
    {
    mustexec();
    }
    catch(){ }

    noexceptionexec();

    try
    {
    mustexec();
    }
    catch() { }
    }
  • 确保最少通过 catch():如果我们确定某些语句集会导致特定的异常集,我们应该将这些代码行放在 try 中,仅处理相应的异常而不是在外部尝试之后放置它。所以上面的第三种情况(混合模式)可能是合适的:

    {
    try
    {
    exec(); //can cause ExceptionXYZ
    }
    catch(ExceptionABC){ }
    catch(ExceptionPQR){ }
    catch(ExceptionXYZ){ }
    }

上面的方法可能比

效率低一些
    {
try
{
try
{
exec(); //can cause ExceptionXYZ
}
catch(ExceptionXYZ){ }
}
catch(ExceptionABC){ }
catch(ExceptionPQR){ }
}

最佳答案

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(){}

对于 point3 是的。 你可以混合你的代码。

关于java - 这种 try-catch 嵌套是否可取 - 任何性能成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14708710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com