2016-12-21 53 views
1

我想查詢一些狀態,並在故障情況下突破我的方法,但是這種情況也必須防範檢查的異常。在檢查布爾狀態時,是否有更簡單的方法來處理try/catch?

我正在處理它是這樣:

try { 
    if (!isSomeState()) { 
     error("Failed to realize state"); 

     return; 
    } 
} 
catch (SomeStateException ex) { 
    error("Failed to realize state"); 

    return; 
} 

我可以拋出checked異常向下拖放到catch塊。但是,這感覺很髒,因爲異常是在重定向程序流程:

try { 
    if (!isSomeState()) 
     throw new SomeStateException(); 
} 
catch (SomeStateException ex) { 
    error("Failed to realize state"); 

    return; 
} 

它沒有意義有方法拋出此異常,因爲我的意思的描述來處理它在此方法。

更新:

爲了澄清,被查詢的狀態利用套接字I/O,因此投擲延伸IOException;所以在這種情況下異常本身並不是多餘的。

生成的布爾值表示某些狀態是否設置爲truefalse。在此異常上返回false沒有任何意義,因爲在繼續查詢其他狀態時沒有意義,否則該狀態在false上可能有效。

+0

變化'isSomeState'方法,以便它拋出'SomeStateException',而不是返回'假' –

+0

我已經添加了一些關於布爾狀態意味着什麼的補充澄清。 'false'是一個有效的結果,而異常表示一些'IOException'。 – Zhro

回答

1

您可以修改isSomeState,以便在拋出異常時返回false。然後,所有你需要做的僅僅是:

if (!isSomeState()) { 
    return; 
} 
+0

狀態並不總是在'IOException'上爲'false';它可能實際上是'真實'但無法達到的,因此是例外。 – Zhro

+0

@Zhro你不控制它嗎?我的意思是你可以根據你的邏輯返回你想要的東西,不是嗎? – Maroun

+0

這取決於我是想對州進行操作還是檢查是否可以訪問。這兩個查詢是相互排斥的。恰巧在我的例子中,報告錯誤和回報的操作是相同的。 – Zhro

0

您可以使用下面的邏輯,它更易讀:

boolean flag = false; 
try 
{ 
    flag = isSomeState(); 
} 
catch(SomeStateException e) 
{ 
    // log here too. 
    flag = false; 
} 
finally 
{ 
    if(!flag) 
    { 
     error("Failed to realize state"); 
     return; 
    } 
} 
相關問題