Observable.Catch<TSource, TException-Methode> (IObservable<TSource>, Func<TException, IObservable<TSource>>)
Setzt eine beobachtbare Sequenz fort, die durch eine Ausnahme des angegebenen Typs mit der vom Handler erzeugten beobachtbaren Sequenz beendet wird.
Namespace:System.Reactive.Linq
Versammlung: System.Reaktiv (in System.Reactive.dll)
Syntax
'Declaration
<ExtensionAttribute> _
Public Shared Function Catch(Of TSource, TException As Exception) ( _
source As IObservable(Of TSource), _
handler As Func(Of TException, IObservable(Of TSource)) _
) As IObservable(Of TSource)
'Usage
Dim source As IObservable(Of TSource)
Dim handler As Func(Of TException, IObservable(Of TSource))
Dim returnValue As IObservable(Of TSource)
returnValue = source.Catch(handler)
public static IObservable<TSource> Catch<TSource, TException>(
this IObservable<TSource> source,
Func<TException, IObservable<TSource>> handler
)
where TException : Exception
[ExtensionAttribute]
public:
generic<typename TSource, typename TException>
where TException : Exception
static IObservable<TSource>^ Catch(
IObservable<TSource>^ source,
Func<TException, IObservable<TSource>^>^ handler
)
static member Catch :
source:IObservable<'TSource> *
handler:Func<'TException, IObservable<'TSource>> -> IObservable<'TSource> when 'TException : Exception
JScript does not support generic types and methods.
Typparameter
- TSource
Der Quellentyp.
- TException
Der Typ der Ausnahme.
Parameter
- source
Typ: System.IObservable<TSource>
Die Quellsequenz.
- handler
Typ: System.Func<TException, IObservable<TSource>>
Die Ausnahmehandlerfunktion, die eine weitere beobachtbare Sequenz erzeugt.
Rückgabewert
Typ: System.IObservable<TSource>
Eine beobachtbare Sequenz, die die Elemente der Quellsequenz enthält, gefolgt von den Elementen, die von der sich ergebenden beobachtbaren Sequenz des Handlers erzeugt werden, falls eine Ausnahme aufgetreten ist.
Hinweis zur Verwendung
In Visual Basic und C# können Sie diese Methode als instance-Methode für jedes Objekt vom Typ IObservable<TSource> aufrufen. Bei Verwendung der Syntax für Instanzenmethoden lassen Sie den ersten Parameter aus. Weitere Informationen finden Sie unter oder .
Bemerkungen
Der Catch-Operator kann verwendet werden, um eine zusätzliche Sequenz in das Abonnement einzuführen, wenn eine Ausnahme auftritt, die denselben Typ wie die Ausnahme aufweist, die in der Handlerfunktion angegeben ist. Dies wird durch den Catch-Operator erreicht, der den Ausnahmehandler ausführt, der die zusätzliche Sequenz erzeugt. Wenn die Quellsequenz ohne Ausnahme bis zur Vervollständigung ausgeführt wird, wird der Handler nicht ausgeführt. Wenn die gefundene Ausnahme nicht den gleichen Typ aufweist, der in der Handlerfunktion angegeben ist, wird diese Ausnahme an den OnError-Handler des Beobachters gesendet. Der Beispielcode in diesem Thema veranschaulicht den Catch-Operator.
Beispiele
Das folgende Beispiel veranschaulicht, wie der Catch-Operator verwendet werden kann, um eine zusätzliche Sequenz von ganzen Zahlen in das Abonnement einzuschließen, wenn eine Ausnahme auftritt. Beachten Sie, dass die ausgelöste Ausnahme vom gleichen Typ wie die Ausnahme in der Signatur der Ausnahmehandlerfunktion sein muss. Wenn es sich nicht um denselben Typ handelt, wird anstelle des Ausnahmehandlers der OnError-Handler für den Beobachter ausgeführt.
using System;
using System.Collections.Generic;
using System.Reactive.Linq;
namespace Example
{
class Program
{
static void Main()
{
//***********************************************************************************************//
//*** sequence1 is generated from the enumerator returned by the RandomNumSequence function. ***//
//*** It will be combined with sequence2 using the Catch() operator only if there is an ***//
//*** exception thrown in sequence1 that is caught by the Catch() operator. ***//
//***********************************************************************************************//
IObservable<int> sequence1 = RandomNumSequence().ToObservable();
//**************************************************************************************************************************//
//*** In this catch operation, the exception handler for Observable::Catch will not be executed. This is because ***//
//*** sequence1 throws an InvalidOperationException which isn't of the NullReferenceException type specified in the ***//
//*** signature of ExNullRefHandler. ***//
//*** ***//
//*** The InvalidOperationException will be caught by the OnError handler instead. ***//
//**************************************************************************************************************************//
Console.WriteLine("==============================================================");
Console.WriteLine("Calling Catch operator with NullReferenceException handler...");
Console.WriteLine("==============================================================\n");
sequence1.Catch((Func<NullReferenceException, IObservable<int>>)ExNullRefHandler)
.Subscribe(i => Console.WriteLine(i),
(ex) => Console.WriteLine("\nException {0} in OnError handler\nException.Message : \"{1}\"\n\n", ex.GetType().ToString(), ex.Message));
//**************************************************************************************************************************//
//*** In this catch operation, the exception handler will be executed. Because InvalidOperationException thrown by ***//
//*** sequence1 is of the InvalidOperationException type specified in the signature of ExInvalidOpHandler(). ***//
//**************************************************************************************************************************//
Console.WriteLine("================================================================");
Console.WriteLine("Calling Catch operator with InvalidOperationException handler...");
Console.WriteLine("================================================================\n");
sequence1.Catch((Func<InvalidOperationException, IObservable<int>>)ExInvalidOpHandler)
.Subscribe(i => Console.WriteLine(i),
(ex) => Console.WriteLine("\nException {0} in OnError handler\nException.Message : \"{1}\"\n\n", ex.GetType().ToString(), ex.Message));
Console.WriteLine("\nPress ENTER to exit...\n");
Console.ReadLine();
}
//*******************************************************************************************************//
//*** ***//
//*** This method will yield a random sequence of 5 integers then throw an InvalidOperationException. ***//
//*** ***//
//*******************************************************************************************************//
static IEnumerable<int> RandomNumSequence()
{
Random random = new Random();
//************************************************//
//*** Yield an a sequence of 5 random integers ***//
//************************************************//
for (int i = 0; i < 5; i++)
{
yield return random.Next(101);
}
//*********************************************************//
//*** Then throw an InvalidOperationException exception ***//
//*********************************************************//
throw new InvalidOperationException("Some Exception Happened!");
}
//*********************************************************************************************************//
//*** ***//
//*** Simple catch handler for NullReferenceExceptions. This handler looks at the exception message and ***//
//*** returns a sequence of int. ***//
//*** ***//
//*********************************************************************************************************//
static IObservable<int> ExNullRefHandler(NullReferenceException ex)
{
//***********************************************************************************************//
//*** Sequence2 will be part of the resulting sequence if an exception is caught in sequence1 ***//
//***********************************************************************************************//
int[] sequence2 = { 0 };
if (ex.Message == "Some Exception Happened!")
sequence2 = new int[] { 5001, 5002, 5003, 5004 };
return sequence2.ToObservable();
}
//************************************************************************************************************//
//*** ***//
//*** Simple catch handler for InvalidOperationExceptions. This handler looks at the exception message and ***//
//*** returns a sequence of int. ***//
//*** ***//
//************************************************************************************************************//
static IObservable<int> ExInvalidOpHandler(InvalidOperationException ex)
{
//***********************************************************************************************//
//*** Sequence2 will be part of the resulting sequence if an exception is caught in sequence1 ***//
//***********************************************************************************************//
int[] sequence2 = { 0 };
if (ex.Message == "Some Exception Happened!")
sequence2 = new int[] { 1001, 1002, 1003, 1004 };
return sequence2.ToObservable();
}
}
}
Es folgt die Beispielausgabe aus dem Beispielcode.
==============================================================
Calling Catch operator with NullReferenceException handler...
==============================================================
68
20
17
6
24
Exception System.InvalidOperationException in OnError handler
Exception.Message : "Some Exception Happened!"
================================================================
Calling Catch operator with InvalidOperationException handler...
================================================================
87
29
84
68
23
1001
1002
1003
1004
Press ENTER to exit...