{"record":{"id":"000e9f98ba4fc564","repo":"App-vNext/Polly","slug":"sleepdurationprovider-000e9f","errorCode":null,"errorMessage":"sleepDurationProvider","messagePattern":"sleepDurationProvider","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"src/Polly/Retry/RetryTResultSyntax.cs","lineNumber":285,"sourceCode":"    /// </summary>\n    /// <typeparam name=\"TResult\">The type of the result.</typeparam>\n    /// <param name=\"policyBuilder\">The policy builder.</param>\n    /// <param name=\"retryCount\">The retry count.</param>\n    /// <param name=\"sleepDurationProvider\">The function that provides the duration to wait for a particular retry attempt.</param>\n    /// <param name=\"onRetry\">The action to call on each retry.</param>\n    /// <returns>The policy instance.</returns>\n    /// <exception cref=\"ArgumentOutOfRangeException\">retryCount;Value must be greater than or equal to zero.</exception>\n    /// <exception cref=\"ArgumentNullException\">Thrown when <paramref name=\"sleepDurationProvider\"/> or <paramref name=\"onRetry\"/> is <see langword=\"null\"/>.</exception>\n    public static RetryPolicy<TResult> WaitAndRetry<TResult>(this PolicyBuilder<TResult> policyBuilder, int retryCount, Func<int, TimeSpan> sleepDurationProvider, Action<DelegateResult<TResult>, TimeSpan, int, Context> onRetry)\n    {\n        if (retryCount < 0)\n        {\n            throw new ArgumentOutOfRangeException(nameof(retryCount), \"Value must be greater than or equal to zero.\");\n        }\n\n        if (sleepDurationProvider == null)\n        {\n            throw new ArgumentNullException(nameof(sleepDurationProvider));\n        }\n\n        if (onRetry == null)\n        {\n            throw new ArgumentNullException(nameof(onRetry));\n        }\n\n        var sleepDurations = Enumerable.Range(1, retryCount)\n                                       .Select(sleepDurationProvider);\n\n        return new RetryPolicy<TResult>(\n            policyBuilder,\n            onRetry,\n            retryCount,\n            sleepDurationsEnumerable: sleepDurations);\n    }\n\n    /// <summary>","sourceCodeStart":267,"sourceCodeEnd":303,"githubUrl":"https://github.com/App-vNext/Polly/blob/d0e46bdb1ee11ea50d0e4b6846d2633d6bc09bac/src/Polly/Retry/RetryTResultSyntax.cs#L267-L303","documentation":"ArgumentNullException thrown at construction by the 4-argument WaitAndRetry<TResult>(retryCount, Func<int,DelegateResult<TResult>,Context,TimeSpan> sleepDurationProvider, Action<...> onRetry) when sleepDurationProvider is null. The provider is invoked per attempt to compute the wait, so a null value would throw later during execution; Polly validates it eagerly with parameter name 'sleepDurationProvider'.","triggerScenarios":"Calling policyBuilder.WaitAndRetry<TResult>(retryCount, null, onRetry) where the second argument (the context-aware provider) is null. Also when a Func field wired from config is null.","commonSituations":"Developer wired onRetry but forgot to supply the duration provider; a DI-registered provider type failed to resolve; refactor changed the provider signature and left a null.","solutions":["Supply a provider such as n => TimeSpan.FromSeconds(n) or a backoff function.","Use a simpler WaitAndRetry overload (fixed TimeSpan list) if dynamic durations are not needed.","Pass an existing provider instance variable confirmed non-null."],"exampleFix":"// before\nvar p = Policy.HandleResult<int>(r => r == 0).WaitAndRetry(3, null, onRetry);\n\n// after\nvar p = Policy.HandleResult<int>(r => r == 0)\n    .WaitAndRetry(3, (attempt, outcome, ctx) => Backoff.Decorate(attempt), onRetry);","handlingStrategy":"validation","validationCode":"if (sleepDurationProvider == null) throw new InvalidOperationException(\"sleepDurationProvider required.\");\nvar policy = Policy.HandleResult<T>(pred).WaitAndRetry(retryCount, sleepDurationProvider, onRetry);","typeGuard":"static bool IsProvider<TResult>(Func<int, DelegateResult<TResult>, Context, TimeSpan> p) => p is not null;","tryCatchPattern":null,"preventionTips":["Supply a provider (e.g. exponential backoff) or switch to a fixed-sleepDurations overload.","Enable nullable reference types.","Register DI providers explicitly and assert non-null at startup."],"tags":["argument-null","wait-and-retry","sleep-duration","validation","polly-v7","legacy"],"backgroundTag":null,"analyzedSha":"d0e46bdb1ee11ea50d0e4b6846d2633d6bc09bac","analyzedAt":"2026-08-13T16:36:01.959Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}