【问题标题】:Best way to handle a try/catch exception in a do ... while() evaluation?在 do ... while() 评估中处理 try/catch 异常的最佳方法?
【发布时间】:2015-05-12 17:57:17
【问题描述】:

在这种情况下:

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));

还有人有其他建议吗?如果是这样,我很想听听他们的意见。谢谢!

【问题讨论】:

  • 您提出的解决方案正是我所推荐的。
  • 我建议将 return result 移到 try 或 finally。如果你使用 try/catch,try/catch/finally 应该是你的顶级范围,业务逻辑在 try 块中,错误处理在 catch 块中,以及无论是否存在你想要发生的任何事情finally 块中的错误。

标签: java exception-handling try-catch do-while


【解决方案1】:

将整个代码块放在一个 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
    }
    

    【讨论】:

    • 外部逻辑(我没有包括它,只是为了让问题很清楚)是如果 someBool != true 或 cursor.moveToNext() != true ,则此循环完成并且什么也没有否则需要发生。整个代码块超过 300 行(不是我写的),但我认为将对其的调用包装在 try/catch 中作为防止崩溃的最后努力可能是有意义的。
    • @AWT 异常不仅仅是为了防止崩溃。它们用于向用户或调用代码报告链上的错误。你需要问自己的问题是你需要传递什么信息——你只需要停止循环吗?是否需要报告循环的具体迭代?还是只需要报告循环遇到错误?
    • 好点。在这种情况下,防止崩溃是我最关心的问题。其次是干净地终止这个循环并让调用者知道它已经完成。调用代码有逻辑来处理这一切的结果是真还是假,为了便于阅读,我只留下了大部分。
    【解决方案3】:

    您总是可以将while() 中的代码移动到循环体中,没什么大不了的

    while(true)
    {
    
        ...
        if( ! someBool )
            break;
        if( ! cursor.moveNext() )
            break;
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2017-03-04
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多