HttpClient 可以抛出哪些异常?

Posted

技术标签:

【中文标题】HttpClient 可以抛出哪些异常?【英文标题】:Which exceptions can HttpClient throw? 【发布时间】:2016-11-18 12:56:23 【问题描述】:

我在 xamarin 表单项目中使用 HttpClient

该类已记录在案,但我找不到任何有关其方法可能抛出哪些异常的文档。

例如,GetAsync 方法没有任何关于可能异常的文档。但我假设它会抛出,例如当服务器无法访问时。

这个类可能抛出的异常列表是否存在于某个地方?

【问题讨论】:

是的,在特定方法的文档中。你为什么想知道? 你得到一个HttpResponseMessage,它具有IsSuccessStatusCodeStatusCode 可以是以下属性之一:msdn.microsoft.com/en-us/library/… 这是你要找的吗? 根据真正的异常,我只发现:"当 HTTP 响应包含错误代码时,HttpClient 不会引发异常。相反,如果状态为错误代码。如果您更愿意将 HTTP 错误代码视为异常,请在响应对象上调用 HttpResponseMessage.EnsureSuccessStatusCode。如果状态代码超出范围 200–299,此方法将引发异常。请注意,HttpClient 可以为以下情况引发异常其他原因——例如,如果请求超时。”SocketException 是我知道的另一个原因。 由于没有记录异常,您很可能会得到一个不完整的列表。任何调用该方法并得到异常的人都可能会告诉您他们得到的特定异常,但他们也不知道其他异常。这就是文档的真正用途,而微软在这方面做得很糟糕。 看起来该方法会将事物包装在 HttpRequestException 中,并且 InnerException 属性将包含实际的底层异常。如果无法连接、服务器不存在等,您会得到HttpRequestException+WebException 【参考方案1】:

正如其他人评论的那样,这取决于您使用 HttpClient 调用的内容。我明白你的意思,所以这里有一些典型方法调用引发的异常。

SendAsync可以扔:

ArgumentNullException 请求为空。 InvalidOperationException HttpClient 实例已发送请求消息。 HttpRequestException 由于网络连接、DNS 故障、服务器证书等基础问题,请求失败 验证或超时。 TaskCanceledException The request timed-out or the user canceled the request's Task.

来源:Microsoft Docs -> HttpClient -> SendAsync

同样GetAsyncPostAsyncPutAsyncGetStringAsyncGetStreamAsync等可以抛出ArgumentNullExceptionHttpRequestException和上面一样(但不是InvalidOperationException)。

来源:Microsoft Docs -> HttpClient -> GetAsync

一旦您致电SendAsyncGetAsync 等,您将获得Task<HttpResponseMessage>。一旦等待,我倾向于调用EnsureSuccessStatusCode() 来抛出一个HttpRequestException,如果有一个不成功的HTTP 状态码返回。 https://github.com/dotnet/corefx/blob/master/src/System.Net.Http/src/System/Net/Http/HttpResponseMessage.cs#L161

【讨论】:

以上是关于HttpClient 可以抛出哪些异常?的主要内容,如果未能解决你的问题,请参考以下文章

解决httpclient抛出URISyntaxException异常

C# HttpClient.SendAsync 在测试某些 URL 时抛出“发送请求时发生错误”异常

未设置 TransferEncodingChunked 时 HttpClient 抛出 OutOfMemory 异常

HttpClient.SendAsync 方法退出而不抛出异常

C# HttpClient 在没有成功状态代码时抛出异常 [关闭]

HttpClient连接池抛出大量ConnectionPoolTimeoutException: Timeout waiting for connection异常排查