我可以使用函数来封装一行代码吗?

时间:2018-08-28 12:18:16

标签: javascript

我想知道是否可以将一行代码与其他一些代码封装在一起?我认为我的意图在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()函数,只是提示如何解决该问题会让我高兴。

1 个答案:

答案 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, {})