{"record":{"id":"a2d846def08b4392","repo":"dotnet/reactive","slug":"value-cannot-be-null-parameter-observer-retrywhen","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'observer')","messagePattern":"Value cannot be null\\. \\(Parameter 'observer'\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"Rx.NET/Source/src/System.Reactive/Linq/Observable/RetryWhen.cs","lineNumber":27,"sourceCode":"\nnamespace System.Reactive.Linq.ObservableImpl\n{\n    internal sealed class RetryWhen<T, U> : IObservable<T>\n    {\n        private readonly IObservable<T> _source;\n        private readonly Func<IObservable<Exception>, IObservable<U>> _handler;\n\n        internal RetryWhen(IObservable<T> source, Func<IObservable<Exception>, IObservable<U>> handler)\n        {\n            _source = source;\n            _handler = handler;\n        }\n\n        public IDisposable Subscribe(IObserver<T> observer)\n        {\n            if (observer == null)\n            {\n                throw new ArgumentNullException(nameof(observer));\n            }\n\n            var errorSignals = new Subject<Exception>();\n            \n            IObservable<U> redo;\n\n            try\n            {\n                redo = _handler(errorSignals);\n\n                if (redo == null)\n                {\n#pragma warning disable CA2201 // (Do not raise reserved exception types.) Backwards compatibility prevents us from complying.\n                    throw new NullReferenceException(\"The handler returned a null IObservable\");\n#pragma warning restore CA2201\n                }\n            }\n            catch (Exception ex)","sourceCodeStart":9,"sourceCodeEnd":45,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/Rx.NET/Source/src/System.Reactive/Linq/Observable/RetryWhen.cs#L9-L45","documentation":"RetryWhen's Subscribe validates the observer and throws ArgumentNullException(\"observer\") when null is passed. Like RepeatWhen, the operator needs a real observer to forward source events and error/retry outcomes to.","triggerScenarios":"source.RetryWhen(errorSignals => ...).Subscribe(null), or any code path passing a null IObserver<T> into RetryWhenObservable.Subscribe.","commonSituations":"Observer produced by a failed factory or DI resolution returning null; uninitialized observer fields in wrapper classes.","solutions":["Construct and pass a valid IObserver<T> to Subscribe.","Prefer Action-based Subscribe overloads or Observer.Create<T>.","Add a null guard before subscribing."],"exampleFix":"// before\nsource.RetryWhen(errors => errors).Subscribe(null);\n// after\nsource.RetryWhen(errors => errors).Subscribe(Observer.Create<T>(onNext, onError, onCompleted));","handlingStrategy":"validation","validationCode":"// C#\nif (observer is null) throw new ArgumentNullException(nameof(observer));\nvar sub = source.RetryWhen(e => e).Subscribe(observer);","typeGuard":"// C#\nstatic bool IsValidObserver<T>(IObserver<T> o) => o is not null;","tryCatchPattern":"try { source.RetryWhen(e => e).Subscribe(observer); }\ncatch (ArgumentNullException ex) { Log(ex); }","preventionTips":["Use Observer.Create<T> to guarantee a non-null observer.","Avoid nullable observer fields in subscription wrappers.","Prefer lambda-based Subscribe overloads."],"tags":["null-argument","retrywhen","subscribe","argumentnull"],"backgroundTag":"null-argument","analyzedSha":"94b5d5ab912789f5abe9a72138a25bbd716fe59c","analyzedAt":"2026-09-15T02:26:24.759Z","contentChangedAt":"2026-09-15T02:26:24.759Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}