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

时间:2012-05-20 14:54:56

标签: java exception exception-handling 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                        
     }
 }

看起来有点尴尬。有什么东西可能有问题吗?

4 个答案:

答案 0 :(得分:37)

没关系,但是如果您的异常处理逻辑很复杂,您可以考虑将其分解为自己的函数。

答案 1 :(得分:10)

编写具有如此多嵌套级别的代码是一种不好的做法,尤其是在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不是异常情况,请考虑标准返回值,但在正常情况下可能会发生。

答案 2 :(得分:3)

答案是否......它是100%罚款..您可能必须在JDBC和IO中使用大量这些,因为它们有很多例外需要处理,一个在另一个内部......

答案 3 :(得分:0)

如果您不想使用嵌套的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                     
        }