Java - 在 try/catch 中执行 try/catch 是不好的做法吗?

Posted

技术标签:

【中文标题】Java - 在 try/catch 中执行 try/catch 是不好的做法吗?【英文标题】:Java - is it bad practice to do a try/catch inside a try/catch? 【发布时间】:2012-05-27 07:37:05 【问题描述】:

如果发生异常,我想执行一些代码。但是该代码也可以生成异常。但我从未见过有人在另一个 try/catch 中执行 try/catch。

我在做什么不好的做法,也许有更好的方法:

 Uri uri = Uri.parse("some url");
 Intent intent = new Intent(Intent.ACTION_VIEW, uri);

 try 
 
     startActivity(intent);
  
 catch (ActivityNotFoundException anfe) 
 
     // Make some alert to me

     // Now try to redirect them to the web version:
     Uri weburi = Uri.parse("some url");
     try
     
         Intent webintent = new Intent(Intent.ACTION_VIEW, weburi);
         startActivity(webintent);
     
     catch ( Exception e )
     
         // Make some alert to me                        
     
 

这似乎有点尴尬。是不是有什么问题?

【问题讨论】:

你可以考虑把catch块里的代码放在自己的方法里。 @HunterMcMillen 好点。 :) 【参考方案1】:

没关系,不过如果你的异常处理逻辑这么复杂,你可以考虑把它分解成自己的函数。

【讨论】:

【参考方案2】:

编写具有如此多嵌套级别的代码是一种不好的做法,尤其是在try-catch 中 - 所以我会说:避免。 另一方面,从catch 块中抛出异常是不可原谅的罪过,所以你应该非常小心。

我的建议 - 将你的 catch 逻辑提取到一个方法中(所以 catch 块很简单)并确保这个方法永远不会抛出任何东西:

Uri uri = Uri.parse("some url");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);

try 

    startActivity(intent);
 
catch (ActivityNotFoundException anfe) 

    // Make some alert to me

    // Now try to redirect them to the web version:
    Uri weburi = Uri.parse("some url");
    Intent webintent = new Intent(Intent.ACTION_VIEW, weburi);
    silentStartActivity(webintent)
 

//...

private void silentStartActivity(Intent intent) 
    try
    
       startActivity(webintent);
    
    catch ( Exception e )
    
        // Make some alert to me                     
    

您似乎(我可能错了)您正在使用异常来控制程序流。如果抛出 ActivityNotFoundException 不是异常情况,但在正常情况下可能会发生,请考虑标准返回值。

【讨论】:

谢谢...为什么你说在 try/catch 中抛出异常是一种罪过? :) "这么多关卡?"我看到总共三个。他在catch 块中的逻辑并不比try 块中的if 块更深。 我看到分解它的问题是我不知道如何检查异常是否会发生的条件,因为我试图转到外部 url。跨度> @GeekedOut:这是您可能提取到函数中的处理。但也请参阅 Tomasz 刚刚添加的关于使用异常控制程序流(一种反模式)的观点,这是一个很好的观点。 @GeekedOut:因为我想到了finally 块,而不是catch 块。从catch 抛出并没有错,从finally 抛出是一个糟糕的想法,因为如果finally 由于异常而被调用,抛出另一个异常将丢弃原来的异常。抱歉,我删除了这部分。【参考方案3】:

答案是否定的。它 100% 没问题。你可能不得不在 JDBC 和 IO 中使用很多这些,因为它们有很多异常需要处理,一个在另一个里面......

【讨论】:

【参考方案4】:

如果您不想使用嵌套的 try 和 catch,这里是替代解决方案, 你也可以这样做:

 boolean flag = false;
 void test();
 if(flag)
  
   test2();
  

测试方法在这里:

private void test()
   try 
        Uri uri = Uri.parse("some url");
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(intent);
   catch (ActivityNotFoundException anfe)
        System.out.println(anfe);
        flag =true;
     
 

现在把剩下的代码放在第二个方法中:

public void test2()
  Uri weburi = Uri.parse("some url");
        try
        
           Intent webintent = new Intent(Intent.ACTION_VIEW, weburi);
           startActivity(webintent);
        
        catch ( Exception e )
        
            // Make some alert to me                     
        

【讨论】:

在 Java 和许多其他编程语言中,您可以用许多不同的方式编写相同的条件逻辑。问题是为什么你认为你的方法比简单地在第一个 try/catch 的 catch 块中编写第二个 try/catch 更好、更有效或更优化。

以上是关于Java - 在 try/catch 中执行 try/catch 是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

java中的“try - catch -finally”结构中的“finally”都有哪些用途

Java异常处理机制:try...catch...的执行流程

java try catch finally return执行顺序

「Java中try.catch.finally执行顺序问题」

「Java中try.catch.finally执行顺序问题」

Java 在try—catch块之后的finally是干啥的?