如何从C#的HttpClient getAsync中正确捕获异常,因此错误超过“发生了一个或多个错误”?

时间:2017-12-06 14:50:19

标签: c# exception-handling dotnet-httpclient

以下是使用System.Net.Http.HttpClient

下载文件的一些代码
try
{
    var responseResult = new System.Net.Http.HttpClient().GetAsync(fileUrl);
    using (var memStream = responseResult.Result.Content.ReadAsStreamAsync().Result)
    {
        using (var fileStream = File.Create(saveToPath))
        {
            memStream.CopyTo(fileStream);
        }

    }
}
catch (Exception e)
{
    Console.WriteLine(e.StackTrace);
}

有时我会调用此文件,但文件无法下载。在这种情况下,会调用catch,但不包含该问题的任何信息:

One or more errors occurred.
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
    at System.Threading.Tasks.Task`1.get_Result()
    at SpPrefetchIndexBuilder.FileDownloader.StartDownloads(Int32 timeout)

如何才能解决此异常的原因?

3 个答案:

答案 0 :(得分:3)

Task.Result抛出AggregateException,所以你可以抓住它。所有异常都将在该异常的InnerExceptions属性内(理论上可以有多个,但在您的情况下只有一个)。第一个例外(或者只有一个例外)也在InnerException属性中。

如果您不想在AggregateException内挖掘,请使用.GetAwaiter().GetResult()代替.Result - 这不会将异常包装到AggregateException中并将其作为是

答案 1 :(得分:1)

由于您在任务上调用.Result,原始异常将保存在catched异常的InnerException属性中。您可以使用以下构造访问它:

string message = e?.InnerException.Message ?? e.Message;

答案 2 :(得分:0)

不确定是否适用,但是您是否尝试过?:Console.WriteLine(ex.GetBaseException()。ToString()。StackTrace)