2016-12-21 9 views
1

私はいくつかの状態を照会し、失敗状態で自分のメソッドから抜け出したいが、この条件もチェックされた例外を防ぐ必要がある。boolean状態をチェックするときにtry/catchを処理するためのよりクリーンな方法がありますか?

私は現在、そのように扱うよ:

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

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

    return; 
} 

私はcatchブロックの中に落下するチェック例外を投げることができました。例外は単にプログラムの流れをリダイレクトされるので、しかし、これは汚い感じている:それは、私が説明するように、この方法でそれを処理することを意図していますので、メソッドは、この例外をスロー持ってしても意味がありません

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

    return; 
} 

更新:

を明確にするために、照会されている状態では、ソケットのI/Oを利用し、従ってIOExceptionの拡張を投げています。この場合、例外自体は余分ではありません。

結果ブール値は、ある状態がtrueまたはfalseに設定されているかどうかを表します。 falseに有効である可能性のある追加の状態を問い合わせ続けることに意味がないので、falseをこの例外で返すのは意味がありません。

+0

変更 'isSomeState'方法、それは' SomeStateException'の代わりに、 'falseを返すがスローされますように' –

+0

ブール値の状態を表現するための追加の説明を追加しました。 'false'は有効な結果ですが、例外は' IOException'を表します。 – Zhro

答えて

1

isSomeStateを変更して、例外をスローする場合はfalseを返すようにすることができます。そして、あなたがする必要があるすべては単純です:

あなたがロジックの下に使用することができます
if (!isSomeState()) { 
    return; 
} 
+0

状態は 'IOException'上で常に' false'であるとは限りません。それは実際には「真」であるが到達不能である可能性があり、したがって例外である。 – Zhro

+0

@Zhroあなたはそれを制御していませんか?私はあなたのロジックに基づいて、あなたが望むものを返すことができるという意味ですか? – Maroun

+0

それは、私がその状態を操作するか、それがアクセス可能かどうかをチェックするかどうかによって異なります。これらの2つのクエリは相互に排他的です。私の例では、エラーとリターンを報告するアクションは同じです。 – 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; 
    } 
} 
関連する問題