为什么WebExceptionStatus.Timeout无法捕获超时错误?

时间:2019-11-11 06:30:46

标签: c# azure-functions httpwebrequest httpwebresponse

我正在使用HttpWebRequest / Response调用WEB API,这有效,并且我有一个try / catch块来处理大多数有效的错误,但是问题是一个特定的错误导致我的try / catch崩溃。

此错误

  

System.Net.Http.HttpRequestException:连接尝试失败,因为一段时间后连接方未正确响应,或者由于连接的主机未能响应---> System.Net.Sockets,建立的连接失败。 SocketException:连接尝试失败,因为一段时间后连接方未正确响应,或者建立的连接失败,因为连接的主机未能响应

     

在System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,Int32端口,CancelationToken cancelToken)

     

---内部异常堆栈跟踪的结尾---

     

在System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,Int32端口,CancelationToken cancelToken)

     

在System.Threading.Tasks.ValueTask`1.get_Result()

     

在System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage请求,CancellationToken cancelledToken)

     

在System.Threading.Tasks.ValueTask`1.get_Result()

     

在System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask`1 creationTask)

     

在System.Threading.Tasks.ValueTask`1.get_Result()

     

在System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage请求,布尔值doRequestAuth,CancellationToken cancelleToken)

     

在System.Net.Http.RedirectHandler.SendAsync(HttpRequest消息请求,CancellationToken取消令牌)

     

在System.Net.Http.DecompressionHandler.SendAsync(HttpRequest消息请求,CancellationToken取消令牌)

     

在System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequest消息请求,CancellationToken取消令牌)

在我的catch子句中没有被这段代码处理,我也不明白为什么

 catch (WebException we)
            {

                JObject emptyObject = null;

                if (we.Status == WebExceptionStatus.Timeout)
                {
                    log.LogInformation($"xxx_V2 HttpWebRequest suffered a timeout for URL: {apiUrl} at: {DateTime.Now}");
                }
...... Removed non relevant code
}

这意味着代码进一步下降,因为它们依赖于响应中存在的标头,但是由于超时,我当然没有响应,这就是为什么我试图在上面捕获它。

1 个答案:

答案 0 :(得分:0)

正如我所看到的,引发的异常属于**System.Net.Http.HttpRequestException**类型,而您对 WebException 类型进行的异常处理是您编写代码的原因之一没有在catch块中执行。尝试以一种优化代码的方式,如果您显式处理WebException以外的任何类型的异常,那么将有一个具有异常基类的catch块,如下所示:

Catch(Exception ex) {

}

WebException类是由WebRequest和WebResponse派生的类抛出的,这些类实现用于访问Internet的可插拔协议。您可以在下面的文档中详细了解此内容:

https://docs.microsoft.com/en-us/dotnet/api/system.net.webexception?view=netframework-4.8

希望它会有所帮助,让我知道您是否需要任何帮助来实现它。

然后您所有未处理的异常都将在此块中处理