HttpClient可以抛出哪些异常?

70

我正在使用Xamarin Forms项目中的HttpClient类。

虽然该类有文档,但是我找不到其方法可能引发哪些异常的任何文档。

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

是否有列表可以列出该类可能引发的所有异常?


1
是的,在特定方法的文档中。你为什么想知道? - CodeCaster
1
你会得到一个 HttpResponseMessage,它有两个属性 IsSuccessStatusCodeStatusCode,可能是以下之一:https://msdn.microsoft.com/zh-cn/library/system.net.httpstatuscode(v=vs.118).aspx 这符合你的需求吗? - Tim Schmelter
3
根据我所发现的真正例外情况,仅有以下内容:当HTTP响应包含错误代码时,HttpClient不会抛出异常。相反,如果状态为错误代码,则IsSuccessStatusCode属性为false。如果您希望将HTTP错误代码视为异常,请在响应对象上调用HttpResponseMessage.EnsureSuccessStatusCode。如果状态代码超出200-299范围,此方法将引发异常。请注意,HttpClient也可能因其他原因抛出异常,例如,如果请求超时,则会抛出SocketException异常。 - Tim Schmelter
9
由于这些异常没有记录,你很可能会得到一个不完整的列表。任何调用该方法并遇到异常的人都可以告诉你他们得到的具体异常,但他们也不知道其他异常。这就是文档的作用,而微软在这方面做得很差。 - Lasse V. Karlsen
2
看起来这个方法会用 HttpRequestException 来包装所有异常,而 InnerException 属性将包含实际的根本异常。如果无法连接,服务器不存在等情况,你会得到 HttpRequestException + WebException - Lasse V. Karlsen
显示剩余4条评论
1个回答

104

其他人已经评论过了,这取决于您使用 HttpClient 调用什么。我明白您的意思,因此以下是一些典型方法调用时抛出的异常。

SendAsync 可能会抛出以下异常:

  • ArgumentNullException 请求为 null。
  • InvalidOperationException 请求消息已由 HttpClient 实例发送。
  • HttpRequestException 请求失败,原因可能是网络连接、DNS 失败、服务器证书验证或超时等底层问题。
  • TaskCanceledException 请求超时或用户取消了请求的 Task

来源:Microsoft Docs -> HttpClient -> SendAsync

类似地,GetAsync PostAsync PutAsync GetStringAsync GetStreamAsync 等方法也可能会抛出 ArgumentNullExceptionHttpRequestException 和上面提到的异常(但不会抛出 InvalidOperationException)。

来源:Microsoft Docs -> HttpClient -> GetAsync

一旦您调用了SendAsyncGetAsync等方法,您就会得到一个Task<HttpResponseMessage>对象。在等待完成后,我倾向于调用EnsureSuccessStatusCode()方法,如果返回的HTTP状态码不是成功的,则会抛出一个HttpRequestException异常。https://github.com/dotnet/corefx/blob/master/src/System.Net.Http/src/System/Net/Http/HttpResponseMessage.cs#L161


我认为最好捕获 OperationCanceledException 而不是 TaskCanceledException - Dai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接