IObservable.Do()
OnError
ハンドラーでオーバーロードされていますが、例外はSubscribe()
呼び出しに伝達されますが、OnError
で指定されている場合Subscribe
- 例外は呼び出し元に伝達されません - 簡単な例を次に示します。
public static void Main()
{
OnErrorInDo(); // throws
OnErrorInSubscribe(); // doesn't throw
}
public void OnErrorInDo()
{
var observableThatThrows = GetEnumerableThatThrows().ToObservable();
var res = observableThatThrows.Do(i => Console.Write("{0}, ", i), LogEx).Subscribe();
}
public void OnErrorInSubscribe()
{
var observableThatThrows = GetEnumerableThatThrows().ToObservable();
var res = observableThatThrows.Do(i => Console.Write("{0}, ", i), LogEx)
.Subscribe(i=>{}, LogEx);
}
public IEnumerable<int> GetEnumerableThatThrows()
{
foreach (var i in Enumerable.Range(0,10))
{
if (i != 5)
yield return i;
else
throw new Exception("ex in enumerable");
}
}
public void LogEx(Exception ex)
{
Console.WriteLine("Ex message:" + ex.Message);
}