62

如果发生异常,我有一些要执行的代码。但是该代码也可以生成异常。但我从未见过有人在另一个 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

4 回答 4

48

没关系,尽管如果您的异常处理逻辑如此复杂,您可能会考虑将其分解为自己的函数。

于 2012-05-20T14:57:10.093 回答
11

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

于 2012-05-20T14:58:47.907 回答
5

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

于 2012-05-20T15:04:06.697 回答
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                     
        }
于 2017-11-05T06:06:48.227 回答