我想知道是否可以将一行代码与其他一些代码封装在一起?我认为我的意图在js示例中变得很清楚。我也想知道这在Java中是否可行。
var mainModel = openModel("Model.model");
var tries = 0;
var maxtries = 5;
var success = false;
while(!success) {
try {
mainModel.packAndcopyModel();
success = true;
} catch(err) {
log('packing failed, trying again; at try '+tries);
tries += 1;
sleep_ms(1000);
}
if(tries === maxtries) {
success = true;
log('ERROR: packing failed, will continue with next action');
}
}
因此packAndcopyModel()将压缩模型,然后将其复制到另一个位置。我的问题是,有时会失败,因为Windows 7会由于硬盘驱动器上的流量过多而引发AccessDenied错误。因此,应等待一秒钟,然后重试。
现在我可以将上面的代码转换为:
var mainModel = openModel("Model.model");
tryFiveTimes(mainModel.packAndcopyModel())
我的问题是,while循环经常出现在我的代码中,这使其非常不干净。一个功能的另一个优点是,如果我决定以不同的方式处理该错误,则只需要更改一个功能的代码即可,而不必在所有错误处都发生错误。
我不希望您给我写一个tryFiveTimes()函数,只是提示如何解决该问题会让我高兴。
答案 0 :(得分:1)
您可以使用重试包(如果有),但是在Java中实现重试类也应该很简单。
最小的python示例。 (示例代码,可能需要进行调整才能工作)
class Retry:
def __init__(self, backoff, max_times, list_of_errors):
self.backoff = backoff
self.max_times = max_times
self.retryable_errors = list_of_errors
self.wait_time = 0.01
def retry_on_failure(self, fn, args):
try:
fn(**args) # here args is a map
except Exception as e:
if (any(self.retryable_errors.map(
lambda re: instanceOf(e, re))) and
self.max_times > 0):
self.max_times -= 1
sleep(self.wait_time)
self.wait_time *= (2^self.backoff)
self.retry_on_failure(fn, args)
retryObj = new Retry(**config)
retryObj.retry_on_failure(mainModel.packAndcopyModel, {})