gpt4 book ai didi

c# - 为什么没有只接受错误处理程序的 Subscribe 重载?

转载 作者:太空狗 更新时间:2023-10-30 00:42:32 25 4
gpt4 key购买 nike

IObservable 有 Next、Next+Error、Next+Complete、Next+Complete+Error 的 Subscribe 重载,但为什么没有仅针对 Errors 的可观察对象?

我假设这是因为可能存在异常的 IObservable 并且它会导致冲突,即:

IObservable<Exception> obs;
obs.Subscribe(ex => { });

RX 不知道您订阅的是 Next 还是 Error。

有没有一种方法可以单独订阅错误而无需创建空的 Complete 委托(delegate)?

obs.Subscribe(
o => { },
ex =>
{
// error-handling-code
});

最佳答案

好吧,这似乎是一个智力问题,所以:

从 c# 编译器的角度来看,对于 IObservable 方法签名,您提议的是(考虑到 T = Exception):

public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext);
public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onError);

这两种方法重载将具有相同的签名,并且编译器不支持它。

从接口(interface)的角度来看,您有如下定义的 IObserver:

public interface IObserver<in T>
{
void OnCompleted();
void OnError(Exception error);
void OnNext(T value);
}

接口(interface)的实现者必须是这样的:

public class Observer<T> : IObserver<T>
{
public void OnCompleted()
{
}

public void OnError(Exception error)
{
// Do something with exception
}

public void OnNext(T value)
{
}
}

因此,即使您不指定 OnNext = () => {},底层基础设施也必须实现它。您不会失去指定它的任何性能。

从观察者模式的逻辑角度来看,您的意图是异步订阅元素/事件的序列。省略 OnNext 函数并仅保留 OnError 的方法签名会误导 Rx 库的用户。如果您明确表示不想在 OnNext 上做任何事情,那就更清楚了。

Once the OnCompleted or OnError method has been received, the Rx grammar guarantees that the subscription can be considered to be finished.

您尝试做的事情等同于创建空的 foreach 循环并等待异常:

try
{
foreach (var e in sequence)
{
// do nothing
}
}
catch (Exception ex)
{
// Do something
}

这不是常见的情况。

关于c# - 为什么没有只接受错误处理程序的 Subscribe 重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14905586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com