{"record":{"id":"a13bb1d81a0dd855","repo":"AvaloniaUI/Avalonia","slug":"value-cannot-be-null-parameter-onerror","errorCode":null,"errorMessage":"Value cannot be null. (Parameter 'onError')","messagePattern":"Value cannot be null\\. \\(Parameter 'onError'\\)","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"src/Avalonia.Base/Reactive/AnonymousObserver.cs","lineNumber":32,"sourceCode":"    private readonly Action<Exception> _onError;\n    private readonly Action _onCompleted;\n\n    public AnonymousObserver(TaskCompletionSource<T> tcs)\n    {\n        if (tcs is null)\n        {\n            throw new ArgumentNullException(nameof(tcs));\n        }\n\n        _onNext = tcs.SetResult;\n        _onError = tcs.SetException;\n        _onCompleted = NoOpCompleted;\n    }\n    \n    public AnonymousObserver(Action<T> onNext, Action<Exception> onError, Action onCompleted)\n    {\n        _onNext = onNext ?? throw new ArgumentNullException(nameof(onNext));\n        _onError = onError ?? throw new ArgumentNullException(nameof(onError));\n        _onCompleted = onCompleted ?? throw new ArgumentNullException(nameof(onCompleted));\n    }\n\n    public AnonymousObserver(Action<T> onNext)\n        : this(onNext, ThrowsOnError, NoOpCompleted)\n    {\n    }\n\n    public AnonymousObserver(Action<T> onNext, Action<Exception> onError)\n        : this(onNext, onError, NoOpCompleted)\n    {\n    }\n\n    public AnonymousObserver(Action<T> onNext, Action onCompleted)\n        : this(onNext, ThrowsOnError, onCompleted)\n    {\n    }\n","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/AvaloniaUI/Avalonia/blob/11c542726898ae954a1ef668c65ec79ec92ab17d/src/Avalonia.Base/Reactive/AnonymousObserver.cs#L14-L50","documentation":"The same AnonymousObserver<T>(onNext, onError, onCompleted) constructor throws ArgumentNullException(nameof(onError)) when the second Action<Exception> is null, again via inline `?? throw`. An error handler is mandatory because unhandled OnError would otherwise be swallowed.","triggerScenarios":"Constructing AnonymousObserver<T> with a non-null onNext but a null onError Action, or calling the (onNext, onError) overload with a null second argument.","commonSituations":"Forgetting to supply an error handler, or passing a null delegate field, when bridging an observable into callbacks.","solutions":["Always pass a non-null Action<Exception> for onError (at minimum log it).","Null-check before constructing if the handler is computed/optional.","Use a static ThrowsOnError or logging fallback so you never silently drop errors."],"exampleFix":"// before\nsource.Subscribe(new AnonymousObserver<T>(onNext, null, onDone)); // throws\n\n// after\nsource.Subscribe(new AnonymousObserver<T>(onNext, ex => Log.Error(ex), onDone));","handlingStrategy":"validation","validationCode":"if (onError is null) onError = ex => Log.Error(ex);\nsource.Subscribe(new AnonymousObserver<T>(onNext, onError, onCompleted));","typeGuard":"bool HasOnError(Action<Exception>? a) => a is not null;","tryCatchPattern":null,"preventionTips":["Always supply a logging error handler; never leave OnError null.","Default optional handlers to a static logger.","Review observer construction in code review for missing error handlers."],"tags":["avalonia","reactive","observer","argumentnull","error-handling"],"backgroundTag":null,"analyzedSha":"11c542726898ae954a1ef668c65ec79ec92ab17d","analyzedAt":"2026-08-13T11:57:40.261Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}