web-dev-qa-db-ja.com

async / await内でHttpClient例外を適切に処理する

HttpClientを使用したasync/await例外処理に関して、私が直面している問題について誰かが少し啓発できることを望んでいました。説明のためにいくつかのコードを作成しましたが、Windows Phone 8デバイスとエミュレーターの両方で実行されています。

    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);
        }
    }

この関数を呼び出すボタンをタップすると、デバッガコンソールに次の出力が生成されます。最も興味深いのは、 大胆な

フォールトリクエストの開始:

タイプ 'System.Net.WebException'の例外がSystem.Windows.ni.dllで発生し、マネージド/ネイティブ境界の前に処理されませんでした

タイプ 'System.Net.WebException'の例外がSystem.Windows.ni.dllで発生し、マネージド/ネイティブ境界の前に処理されませんでした

Mscorlib.ni.dllで「System.Net.Http.HttpRequestException」タイプの最初のチャンス例外が発生しました

タイプ 'System.Net.Http.HttpRequestException'の例外がmscorlib.ni.dllで発生し、マネージド/ネイティブ境界の前に処理されませんでした

CAUGHT EXCEPTION:(そしてここではHttpRequestExceptionを出力します)

もちろん、呼び出しているURLはナンセンスなので、この場合はエラーが発生することを期待しています。ここで理解していないのは、出力が例外がキャッチされたことを同時に報告するときに、デバッガーが例外が処理されないことを報告する理由です。また、出力の印刷中にアプリのUI側の応答性が大幅に低下し、おそらく何かが間違っていることを示します。

これは、asyncおよびawaitで作業するときに例外を処理する方法ではありませんか?どんな入力でも感謝します!ありがとう。

13
Nils Holtar

これは、デバッガーのアーティファクトです。キャッチされていないため、例外は「キャッチされていない」と判断していますまだ。この場合、これは予想される動作です。

例外を正しく処理しています。

7
Stephen Cleary

HttpClientを使用しているので、response.EnsureSuccessStatusCode();を使用してみてください

HttpClientは、応答ステータスが成功コードでない場合に例外をスローするようになりました。

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

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

コードの元のソース: http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

29
mirushaki

デバッガーは、この例外が最初のチャンスであることを伝えています。デバッガーがプロセスにアタッチされると、スローされるすべての例外について通知され、デバッガーの構成方法に基づいて、デバッガーが何をするかが決定されます。詳細については、 ファーストチャンスの例外とは何ですか を参照してください。

補足として、特定の例外のみをキャッチして、予想される例外とその理由を理解できるようにしてください。

0
Anupam