wake-up-neo.com

HttpClient-Ausnahmen innerhalb von async/await ordnungsgemäß behandeln

Ich hatte gehofft, jemand könnte mich ein wenig über ein Problem aufklären, mit dem ich mich im Zusammenhang mit Async/Exception mit HttpClient befassen muss. Ich habe etwas Code zur Veranschaulichung geschrieben, der sowohl auf einem Windows Phone 8-Gerät als auch auf dem Emulator ausgeführt wird:

    private async void SearchButton_Click(object sender, EventArgs e)
    {
        try
        {
            HttpClient client = new HttpClient();
            System.Diagnostics.Debug.WriteLine("BEGIN FAULTY REQUEST:");
            string response = await client.GetStringAsync("http://www.ajshdgasjhdgajdhgasjhdgasjdhgasjdhgas.tk/");
            System.Diagnostics.Debug.WriteLine("SUCCESS:");
            System.Diagnostics.Debug.WriteLine(response);
        }
        catch (Exception exception)
        {
            System.Diagnostics.Debug.WriteLine("CAUGHT EXCEPTION:");
            System.Diagnostics.Debug.WriteLine(exception);
        }
    }

Wenn Sie auf die Schaltfläche tippen, die diese Funktion aufruft, wird in der Debugger-Konsole die folgende Ausgabe erzeugt. Die interessanteste ist die in fett gedruckt:

BEGINN DER FAULTY ANFRAGE:

Eine Ausnahme des Typs 'System.Net.WebException' ist in System.Windows.ni.dll aufgetreten und wurde vor einer verwalteten/systemeigenen Grenze nicht behandelt

Eine Ausnahme des Typs 'System.Net.WebException' ist in System.Windows.ni.dll aufgetreten und wurde vor einer verwalteten/systemeigenen Grenze nicht behandelt

In der Datei mscorlib.ni.dll ist eine Ausnahme bei der ersten Chance des Typs 'System.Net.Http.HttpRequestException' aufgetreten

Eine Ausnahme des Typs 'System.Net.Http.HttpRequestException' trat in mscorlib.ni.dll auf und wurde nicht vor einer verwalteten/systemeigenen Grenze behandelt

CAUGHT EXCEPTION: (Und hier wird die HttpRequestException ausgegeben)

Natürlich erwarte ich in diesem Fall einen Fehler, da die URL, die ich anrufe, Unsinn ist. Was ich hier nicht verstehe, ist, warum der Debugger meldet, dass die Ausnahmen nicht behandelt werden, wenn die Ausgabe gleichzeitig meldet, dass die Ausnahme abgefangen wurde. Außerdem reagiert die Benutzeroberfläche der App während des Druckens der Ausgabe viel weniger, was darauf hinweist, dass möglicherweise etwas nicht stimmt.

Ist dies nicht die Art und Weise, mit Ausnahmen umzugehen, wenn Sie mit asynchron arbeiten und warten? Ich freue mich über jeden Input! Vielen Dank.

10
Nils Holtar

Dies ist ein Artefakt des Debuggers. Dies bestimmt, dass eine Ausnahme "nicht erfasst" wird, weil sie nicht noch abgefangen wird. In diesem Fall ist dies ein erwartetes Verhalten.

Sie behandeln die Ausnahmen korrekt.

7
Stephen Cleary

Versuchen Sie bei der Verwendung von HttpClient, response.EnsureSuccessStatusCode(); zu verwenden.

Jetzt löst HttpClient eine Ausnahme aus, wenn der Antwortstatus kein Erfolgscode ist.

try
{
    HttpResponseMessage response = await client.GetAsync("http://www.ajshdgasjhdgajdhgasjhdgasjdhgasjdhgas.tk/");
    response.EnsureSuccessStatusCode();    // Throw if not a success code.

    // ...
}
catch (HttpRequestException e)
{
    // Handle exception.
}

URSPRÜNGLICHE QUELLE DES CODE: http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

25
mirushaki

Der Debugger sagt Ihnen, dass diese Ausnahme die erste Chance ist. Wenn ein Debugger an Ihren Prozess angehängt wird, wird er für jede ausgelöste Ausnahme benachrichtigt. Anschließend bestimmt er, wie der Debugger konfiguriert wurde. Sie können durchgehen Was ist die erste Zufallsausnahme? für mehr Details.

Fangen Sie nebenbei nur bestimmte Ausnahmen auf, damit Sie verstehen, welche Ausnahmen Sie erwarten und warum.

0
Anupam