我正在使用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
}
这意味着代码进一步下降,因为它们依赖于响应中存在的标头,但是由于超时,我当然没有响应,这就是为什么我试图在上面捕获它。
答案 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
希望它会有所帮助,让我知道您是否需要任何帮助来实现它。
然后您所有未处理的异常都将在此块中处理