Есть ли рекомендуемые шаблоны для повторных попыток? - PullRequest
1 голос
/ 23 сентября 2011

Я работаю над сценарием, который постоянно отслеживает набор файлов, чтобы гарантировать, что им не больше четырех часов. В то время, когда эти файлы копируются, они могут рассматриваться как отсутствующие в сценарии, поэтому я вручную повторяю один раз внутри блока try ... catch .... E.g.:

    try
    {
        report.age = getFileAgeInMilliSeconds(report.filePath);

        // If the file is over age threshhold. 
        if ( report.age > REPORT_AGE_THRESHOLD )
        {
            // Generate an alert and push it onto the stack.
            downtimeReportAlerts.push(generateOldFileAlert(report));
        }
    }
    // If we have trouble...
    catch (e)
    {
        // Find out what the error was and handle it as well as possible.
        switch (e.number)
        {
        case FILE_NOT_FOUND_ERROR_CODE:
            // Try once more.
            WScript.Sleep(FILE_STAT_RETRY_INTERVAL);

            try
            {
                report.age = getFileAgeInMilliSeconds(report.filePath);

                // If the file is over age threshhold. 
                if ( report.age > REPORT_AGE_THRESHOLD )
                {
                    // Generate an alert and push it onto the stack.
                    downtimeReportAlerts.push(generateOldFileAlert(report));
                }
            }
            // If we have trouble this time...
            catch (e)
            {
                switch (e.number)
                {
                case FILE_NOT_FOUND_ERROR_CODE:
                    // Add an alert to the stack.
                    downtimeReportAlerts.push(generateFileUnavailableAlert(report));

                    break;

                default:
                    // No idea what the error is. Let it bubble up.
                    throw(e);
                    break;
                }
            }
            break;

        default:
            // No idea what the error is. Let it bubble up.
            throw(e);
            break;
        }
    }

Существуют ли какие-либо установленные шаблоны для повторения операции в сценарии этого типа? Я думал о том, чтобы попытаться переписать это в рекурсивную функцию, так как здесь много дублирующегося кода, где ошибки могут появиться, но я не был уверен, как и думал, что сначала проверю, есть ли лучшее решение.

1 Ответ

3 голосов
/ 23 сентября 2011

Рекурсивный метод, который пытается выполнить push, скорее всего, будет подходить, все еще используя try..catch, чтобы повторить рекурсивный метод (возможно, даже при включенном «спящем» режиме и любой другой конкретной обработке ошибок).,Я бы ввел константу RETRY_COUNT, определяющую, сколько раз она должна вызываться рекурсивно, чтобы она не входила в непрерывный цикл, если не было обнаружено никакой другой ошибки, и просто увеличивала переменную "strikeCount", чтобы отслеживать, сколько раз она пыталась выполнитьтак что вы можете выйти из цикла после того, как он достигнет значения RETRY_COUNT.

...