[英]Embedding try-catch blocks within try-catch blocks in Java
假設我有方法a()和方法b(),它們都可能拋出異常。 在我的計划中,有一種情況我必須至少打電話給其中一個; 我稱之為無關緊要。 但是,如果其中一個拋出異常,我必須調用另一個異常。 如果他們都拋出異常,我不需要做任何事情。
我在考慮做這樣的事情:
try {
a();
catch (Exception e) {
try {
b();
catch (Exception e) {
}
}
但我認為如果我有兩種以上的方法可以調用,這將是不切實際的。 所以我想知道是否有更優雅或更好的方式來做我想做的事情。
您可以
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
}
您可以在每個案例之后返回,以便在第一次成功之后返回。
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();
}
在如此普遍性的水平上討論實用選項很困難,但你可以這樣做:
boolean succeeded = false;
try {
a();
succeeded = true;
} catch (Exception e) {
// intentional ...
}
if (not succeeded) {
try {
b();
catch (Exception e) {
...
}
}
...以及使用條件(或break
或return
)以避免嵌套的所有其他安排。
但是,它們是否更“優雅”......或者更具可讀性......將高度依賴於環境。 而且還依賴於讀者。 (作為一名經驗豐富的Java程序員,我對理解嵌套異常沒有任何困難。根據我的經驗, 旨在避免嵌套的人工構造可能會導致代碼難以閱讀/理解。)
我希望你是不是真的要趕上Exception
......“因為如果你是,那是不是比try / catch語句的嵌套一個更糟糕的問題!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.