2016-12-21 19 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; 
    } 
} 
相关问题