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执行顺序问题」