Heim > Backend-Entwicklung > C++ > Können in asynchronen Void-Methoden ausgelöste Ausnahmen durch aufrufende Methoden abgefangen werden?

Können in asynchronen Void-Methoden ausgelöste Ausnahmen durch aufrufende Methoden abgefangen werden?

Barbara Streisand
Freigeben: 2025-01-24 02:43:10
Original
389 Leute haben es durchsucht

Can Exceptions Thrown in Async Void Methods Be Caught by Calling Methods?

Ausnahmebehandlung asynchroner void Methoden

Bei der Verwendung von Microsofts Async CTP für die asynchrone Programmierung ist es wichtig, das Ausnahmebehandlungsverhalten asynchroner void Methoden zu verstehen. Stellen Sie sich das folgende Szenario vor:

<code class="language-csharp">public async void Foo()
{
    var x = await DoSomethingAsync();
}

public void DoFoo()
{
    try
    {
        Foo();
    }
    catch (ProtocolException ex)
    {
        // 异常将永远不会被捕获。
    }
}</code>
Nach dem Login kopieren

Die Frage ist: Kann die in der asynchronen Methode DoFoo ausgelöste Ausnahme in der aufrufenden Methode Foo abgefangen werden?

Antwort: Ja (aber es gibt Voraussetzungen)

Ausnahmen sprudeln bis zum Anrufcode, aber nur, wenn Sie einen Anruf an await oder Wait() Foo benötigen. Ändern Sie den Code wie folgt:

<code class="language-csharp">public async Task Foo()
{
    var x = await DoSomethingAsync();
}

public async void DoFoo()
{
    try
    {
        await Foo();
    }
    catch (ProtocolException ex)
    {
        // 异常将被捕获,因为它是一个异步方法。
    }
}

public void DoFoo()
{
    try
    {
        Foo().Wait();
    }
    catch (ProtocolException ex)
    {
        // 异常将被捕获,因为调用被等待。
    }
}</code>
Nach dem Login kopieren

Dies ermöglicht die Ausnahmebehandlung im aufrufenden Code.

Es ist jedoch wichtig zu beachten, dass Stephen Cleary, eine Autorität auf dem Gebiet der asynchronen Programmierung, warnt:

„Asynchrone void-Methoden haben unterschiedliche Fehlerbehandlungssemantiken. Wenn eine Ausnahme von einer asynchronen Task- oder asynchronen Task<T>-Methode ausgelöst wird, wird die Ausnahme abgefangen und auf dem Task-Objekt platziert. Richtig Für asynchrone void-Methoden gibt es kein Task-Objekt, sodass jede von einer asynchronen void-Methode ausgelöste Ausnahme direkt auf dem void ausgelöst wird, das aktiv war, als die asynchrone SynchronizationContext-Methode initiiert wurde.

Darüber hinaus kann die Verwendung von

zum Warten auf den Abschluss einer Aufgabe die Anwendung blockieren, wenn .NET beschließt, die Methode synchron auszuführen. Wait()

Das obige ist der detaillierte Inhalt vonKönnen in asynchronen Void-Methoden ausgelöste Ausnahmen durch aufrufende Methoden abgefangen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage