【问题标题】:Java - is it bad practice to do a try/catch inside a try/catch?Java - 在 try/catch 中执行 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 好点。 :)

标签: java exception exception-handling try-catch


【解决方案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 更好、更有效或更优化。
      猜你喜欢
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 2011-11-19
      相关资源
      最近更新 更多