【问题标题】:Are sync exceptions possible in HttpClient?HttpClient 中是否可能出现同步异常?
【发布时间】:2020-08-05 10:46:24
【问题描述】:

现在,我不是在谈论 ArgumentNullExceptionInvalidOperationException,而是或多或少只是在谈论 HttpRequestException

var responseAsync = httpClient.SendAsync(something);
try
{
    var response = await responseAsync;
}
catch(Exception)
{
}

这段代码是否会抛出任何异常,或者我们可以安全地假设所有可能的异常只能在await期间发生?

【问题讨论】:

  • 您是否有特定的理由不通过同一个try/catch 同时保护SendAsyncawait?我认为它没有具体记录哪些异常可以/不能同步抛出。
  • @janw 我知道两者都是可能的,否则我什至不会问
  • 显示的代码无法编译。如果你想在响应失败时throw,你可以使用`HttpResponseMessage.EnsureSuccessStatusCode()方法。
  • 首先它会编译,为什么不编译。其次,不成功的状态码和httpClient同步异常有什么关系?不仅HttpResponseMessage 是在Task 之后创建的,它实际上是在任务完成时创建的。

标签: c# dotnet-httpclient


【解决方案1】:

“但或多或少只是关于 HttpRequestException”

MSDN:

doco 很清楚:

HttpRequestException 由于网络连接、DNS 故障、服务器证书验证超时等基础问题,请求失败。

如果说你的猫拔掉了网络线索,那么答案将是“是”

这段代码会抛出任何异常吗,

是的。

或者我们可以安全地假设所有可能的异常只能在等待期间发生?

它也可能出现在下一行,因为当SendAsync 返回时(不要与Task 完成时混淆),Task 已经创建,而且可能性很小在你进入下一行之前投掷。

var responseAsync = httpClient.SendAsync(something);

编辑:(来自我下面的评论) 此外,据我们所知,SendAsync 可能会在创建 Task 之前执行一些“初始检查”。在这种情况下,您需要在上面添加try/catch

【讨论】:

  • 那么您能否列出(至少粗略地)可能出现同步异常的情况?我了解一般连接。这是合乎逻辑的,如果没有可用的网络接口,则无需等待。但即使是 DNS 部分也应该是异步的,不是吗?
  • @Morse 完全有可能在创建实际的Task 之前抛出异常。您将再次需要将它们包装在try/catch 中。我不太确定您为什么不想将 httpClient.SendAsync 放在单个 try/catch 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
相关资源
最近更新 更多