private async Task ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) { stopWatch.Restart(); PerformTaskSetup(context, strategy, task, false); Exception taskException = null; try { // Execute the task. await strategy.ExecuteAsync(task, context).ConfigureAwait(false); } catch (Exception exception) { _log.Error("An error occurred when executing task '{0}'.", task.Name); taskException = exception; // Got an error reporter? if (task.ErrorReporter != null) { await ReportErrorsAsync(strategy, task.ErrorReporter, exception); } // Got an error handler? if (task.ErrorHandler != null) { await HandleErrorsAsync(strategy, task.ErrorHandler, exception, context); } else { // No error handler defined for this task. // Rethrow the exception and let it propagate. throw; } } finally { if (task.FinallyHandler != null) { await strategy.InvokeFinallyAsync(task.FinallyHandler); } PerformTaskTeardown(context, strategy, task, stopWatch.Elapsed, false, taskException); } // Add the task results to the report if (IsDelegatedTask(task)) { report.AddDelegated(task.Name, stopWatch.Elapsed); } else { report.Add(task.Name, CakeReportEntryCategory.Task, stopWatch.Elapsed); } }
/// <summary> /// Invokes the finally handler. /// </summary> /// <param name="action">The action.</param> public Task InvokeFinallyAsync(Func <Task> action) => _default.InvokeFinallyAsync(action);