假设我有方法a()和方法b(),它们都可能抛出异常。在我的计划中,有一种情况我必须至少打电话给其中一个;我称之为无关紧要。但是,如果其中一个抛出异常,我必须调用另一个异常。如果他们都抛出异常,我不需要做任何事情。
我在考虑做这样的事情:
try {
a();
catch (Exception e) {
try {
b();
catch (Exception e) {
}
}
但我认为如果我有两种以上的方法可以调用,那将是不切实际的。所以我想知道是否有一种更优雅或更好的方式来做我想做的事情。
答案 0 :(得分:2)
你可以
abc:
{
try
{
a();
break abc;
}
catch(Exception e){}
try
{
b();
break abc;
}
catch(Exception e){}
try
{
c();
break abc;
}
catch(Exception e){}
}
如果链条更长,可能更好
for(int i=0; i<4; i++)
{
try
{
switch(i)
{
case 0: a(); break;
case 1: b(); break;
case 2: c(); break;
case 3: d(); break;
}
}
catch(Exception e){} // next
}
答案 1 :(得分:2)
您可以在每个案例之后返回,这样在第一次成功之后,将返回一个返回。
public void uponSuccessStop() {
try {
a();
return;
} catch (Exception e) {}
try {
b();
return;
} catch (Exception e) {}
try {
c();
return;
} catch (Exception e) {}
}
另一种选择是抛弃异常,并使用短路布尔逻辑:
public boolean tryA() {
try {
a();
return true;
} catch (Exception e) {
return false;
}
}
// repeat for B and C
public void uponSuccessStop() {
boolean succeeded = tryA() || tryB() || tryC();
}
答案 2 :(得分:0)
在如此普遍的水平上讨论实际选择很困难,但你可以这样做:
boolean succeeded = false;
try {
a();
succeeded = true;
} catch (Exception e) {
// intentional ...
}
if (not succeeded) {
try {
b();
catch (Exception e) {
...
}
}
...以及使用条件(或break
或return
)以避免嵌套的所有其他安排。
但是,它们是否更“优雅”......或者更具可读性......将依赖于背景。而且还依赖于读者。 (作为一名经验丰富的Java程序员,我对理解嵌套异常没有任何困难。根据我的经验,旨在以避免嵌套的人工构造可能导致更难的代码被读取/明白。)
我希望你不是真的要抓住Exception
...'cos,如果你是,这是一个很多更糟糕的问题而不是嵌套of try / catch !!