这是an easy program to introduce the Reactive Framework。但我想通过修改程序来尝试错误处理程序:
var cookiePieces = Observable.Range(1, 10);
cookiePieces.Subscribe(x =>
{
Console.WriteLine("{0}! {0} pieces of cookie!", x);
throw new Exception(); // newly added by myself
},
ex => Console.WriteLine("the exception message..."),
() => Console.WriteLine("Ah! Ah! Ah! Ah!"));
Console.ReadLine();
在此示例中,使用了以下重载。
public static IDisposable Subscribe<TSource>(
this IObservable<TSource> source,
Action<TSource> onNext,
Action<Exception> onError,
Action onCompleted);
我希望我会看到打印的异常消息,但控制台应用程序崩溃了。是什么原因?
答案 0 :(得分:5)
异常处理程序用于在observable本身中创建的异常,而不是由观察者创建。
激发异常处理程序的简单方法是这样的:
using System;
using System.Linq;
class Test
{
static void Main(string[] args)
{
var xs = Observable.Range(1, 10)
.Select(x => 10 / (5 - x));
xs.Subscribe(x => Console.WriteLine("Received {0}", x),
ex => Console.WriteLine("Bang! {0}", ex),
() => Console.WriteLine("Done"));
Console.WriteLine("App ending normally");
}
}
输出:
Received 2
Received 3
Received 5
Received 10
Bang! System.DivideByZeroException: Attempted to divide by zero.
at Test.<Main>b__0(Int32 x)
at System.Linq.Observable.<>c__DisplayClass35a`2.<>c__DisplayClass35c.<Select
>b__359(TSource x)
App ending normally
答案 1 :(得分:3)
在Rx库中,传入操作于IObservable(Select,Where,GroupBy等...)的运算符的任何用户代码都将被捕获并发送给订阅了observable的观察者的OnError处理程序。处理这些的原因是它们是计算的一部分。
Observer代码中发生的异常必须由用户处理。由于他们在计算结束时,Rx不清楚如何处理这些。
答案 2 :(得分:0)
它是否真的崩溃或跳转到Visual Studio并向您显示异常发生?如果第二个为真,你应该看看菜单栏中的Debug - Exception并取消选择右边的所有内容。