Я работаю над сценарием, который постоянно отслеживает набор файлов, чтобы гарантировать, что им не больше четырех часов. В то время, когда эти файлы копируются, они могут рассматриваться как отсутствующие в сценарии, поэтому я вручную повторяю один раз внутри блока 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;
}
}
Существуют ли какие-либо установленные шаблоны для повторения операции в сценарии этого типа? Я думал о том, чтобы попытаться переписать это в рекурсивную функцию, так как здесь много дублирующегося кода, где ошибки могут появиться, но я не был уверен, как и думал, что сначала проверю, есть ли лучшее решение.