2012-03-19 72 views
1

我正在调用一个涉及大量抓取和更新可能需要10多分钟时间的表的方法。这是通过使用后台线程完成的,以便UI可以响应并且用户不必等待它完成。从后台线程的catch块中更新表状态

有可能会引发异常。在这种情况下,我需要将列的状态从“待处理”更改为“失败”。

在catch块中做到这一点很好吗?我可以catch中写入代码,以便执行查询以将状态更新为失败?这是正确的方式还是有任何其他方式来做到这一点?

编辑:我可以做这样的事情,这样,当抛出一个异常,状态被更新为“失败”,并异常堆栈跟踪打印出来?

catch (Exception e) { 
     updateStatusByReqId(reqKey, "F"); 
     e.printStackTrace(); 
     } 

这是否会确保如果有任何异常,申请的状态被更改为“失败”?请注意,在线创建请求时,请求将处于“待处理”状态。它应该保持悬而未决,如果一切正常,否则更改为“失败”

回答

1

如果你编写代码来更新catch块中的状态,它会正常工作,但是因为你在一个方法里面,所以最好从methos返回一个布尔值并且更新线程调用者的ui ,这样的事情:

private boolean updateDatabase() { 
    try { 
    //Your long updating code ... 
} catch { 
return false; 
} 
return true; 
} 

然后就可以调用从后台线程的方法,登录界面中的状态,如果它返回false:

if(!updateDatabase()) { 
//Update UI status 
} 

做这种方式是更好的风格,从我的角度来看...

+0

我不需要更新UI。我只想将状态更改为“失败”,以便将来不会进行进一步处理。 – Chillax 2012-03-19 07:21:28

+0

即时通讯标题已更改为更新用户界面状态。我只想在列中添加状态,而不需要在UI中显示。用户界面不必等待程序结束 – Chillax 2012-03-19 07:23:36

+1

然而,您仍然可以应用解决方案 – aleroot 2012-03-19 07:25:20

0

这是好的写错误相关代码在catch块!

1

我不会把代码放在catch块中。把逻辑更新状态在一个单独的类和方法,并调用它(对GUI):

String currentColumn = ""; 
try { 
    // ... 
} catch (SomeExceptions se) { 
    updateColumnStatus(currentColumn, se); // local method/KISS 
    continue; // we're in a loop, right? 
} 
+0

那就是我的意思。调用一个方法。你能在这个问题上看到我的更新吗? – Chillax 2012-03-19 07:18:51

0

看起来例外的是某种“正常”的校车流量(如验证)的。所以,简短的回答是你可以在catch块中做一些处理。

警告:虽然您可以在catch块中编写几乎所有的东西,但更喜欢在catch块中执行错误处理或错误恢复。

这个异常与数据库访问有关吗?您无法将 列更新为“失败”。无论如何你需要在这种情况下进行一些额外的处理。为什么不在所有情况下使用相同的?