2015-05-12 36 views
2

在这种情况下:在do ... while()评估中处理try/catch异常的最佳方法?

Cursor cursor = dbHandler.fetchEvents(); 
boolean someBool = true; 

do { 
    someStuff(); 
    variables = things; 
    otherStuff(); 
} while (someBool && cursor.moveToNext()); 

有一种可能性,即cursor.moveToNext()可能抛出一些例外的,特别是如果我的数据库被意外关闭,而我用光标的工作。

处理while()评估中引发的任何可能异常的最佳方法是什么?目前,整个事情只是崩溃。我宁愿避免这种情况。编译器不喜欢我直接将try/catch添加到while()eval中的努力,而且它很丑陋。我想我需要创建,这是否一种新的方法:

private boolean moveToNext(cursor) { 
    boolean result = false; 
    try { 
     result = cursor.moveToNext(); 
    } catch (Exception e) { 
     ... error handling ... 
    } 
    return result; 
} 

,然后改变我的eval环路:

Cursor cursor = dbHandler.fetchEvents(); 
boolean someBool = true; 

do { 
    someStuff(); 
    variables = things; 
    otherStuff(); 
} while (someBool && moveToNext(cursor)); 

没有人有任何其他建议?如果是这样,我很乐意听到他们。谢谢!

+2

您提出的解决方案正是我所推荐的解决方案。 – tnw

+1

我建议将'return result'移入try或finally。如果你使用try/catch,try/catch/finally应该是你的顶级范围,try块中的业务逻辑,catch块中的错误处理以及任何你想发生的事情,而不管是否存在finally块中的错误。 – Bardicer

回答

2

将整个代码块放入一个try/catch块中,并且该块应该在丢失数据库连接时进行捕获。

然后,您需要重新调查整个模块以查看清理过程是否合理,并为您提供try/catch的“catch块”的内容。一旦你这样做了,你可能会注意到你的真实代码有了进一步的改进,这可能会让你发布这个例子,而且当你关注你所关心的东西时,这些建议就不那么​​重要了。

2

这真的取决于您在遇到错误时想要发生的情况。当你得到异常时,你应该跳过循环的迭代并继续下一个循环,或者直接停止迭代?或者是整个循环系统发生故障,并且您需要告诉用户出现问题?

如果你真的关心分别处理循环的每个迭代,那么你的方法将工作正常。或者,如果你想只检测整个循环是否遇到错误或没有,那么你可以用在try块整个事情:

try { 
    Cursor cursor = dbHandler.fetchEvents(); 
    boolean someBool = true; 

    do { 
     someStuff(); 
     variables = things; 
     otherStuff(); 
    } while (someBool && cursor.moveToNext()); 
} catch (Exception e) { 
    //report to the user that the loop failed 
} 
+0

外部逻辑(我没有包括它,只是问题很明显)是,如果someBool!= true或cursor.moveToNext()!= true,则完成此循环并且不需要发生其他任何事情。这整个区块超过300行(我没有写),但我认为这可能是有道理的,在try/catch中打电话给它,作为防止崩溃的最后努力。 – AWT

+0

@AWT异常并不仅仅是为了防止崩溃。它们用于向用户或调用代码报告链上的错误。你需要问自己的问题是你需要传递什么信息 - 你只需要停止循环?你需要报告循环的特定迭代吗?或者你只需​​要报告循环遇到错误? –

+0

好点。在这种情况下,防止碰撞是我最关心的问题。次要的是要干净地终止这个循环,并让调用者知道它已完成。调用代码有逻辑来处理这一切是否评估为真或假,我只是把它的大部分留出来让它易于阅读。 – AWT

1

您可以随时在while()移动代码的循环体,无大特卖

while(true) 
{ 

    ... 
    if(! someBool) 
     break; 
    if(! cursor.moveNext()) 
     break; 
} 

然后用任何你喜欢的代码包围它。