Почему ошибка тайм-аута не перехватывается WebExceptionStatus.Timeout? - PullRequest
0 голосов
/ 11 ноября 2019

Я использую HttpWebRequest / Response для вызова WEB API, это работает, и у меня есть блок try / catch для обработки ошибок, который в основном работает, но проблема в том, что одна конкретная ошибка приводит к сбою try / catch.

Эта ошибка

System.Net.Http.HttpRequestException: попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, так как подключенный хост не смог ответить---> System.Net.Sockets.SocketException: попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через определенный промежуток времени, или не удалось установить соединение, так как подключенный хост не смог ответить

в системе. Net.Http.ConnectHelper.ConnectAsync (Строковый хост, порт Int32, CancellationToken cancellationToken)

--- Конец внутренней трассировки стека исключений ---

в System.Net.Http.ConnectHelper. ConnectAsync (Строковый хост, порт Int32, CancellationToken cancellationToken)

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

в System.Net.Http.HttpConnectionPool.CreateConnectionAsync (запрос HttpRequestMessage, CancellationToken cancellationToken)

в системе. ValueTask`1.get_Result ()

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

в System.Threading.Tasks.ValueTask`1.get_esult (1022 *

в System.Net.Http.HttpConnectionPool.SendWithRetryAsync (запрос HttpRequestMessage, Boolean doRequestAuth, CancellationToken cancellationToken)

в System.Net.Http.RedirectHandynS RegencySignStation*

в System.Net.Http.DecompressionHandler.SendAsync (запрос HttpRequestMessage, CancellationToken cancellationToken)

в System.Net.Http.DiagnosticsHandler.SendAsync (HttpRequestMessage 1030 * *en * 10enen * 10enen * 10enen * 10enen * 10enen * 10Ten * 10 * * * * * * * *

не обрабатывается этой компаниейde в моем предложении 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 голосов
/ 11 ноября 2019

Как я вижу, возбуждаемое исключение относится к типу **System.Net.Http.HttpRequestException**, и обработка исключений, которую вы выполняли для типа WebException, является одной из причин того, что ваш код не выполняется вблок улова. Попытайтесь оптимизировать свой код таким образом, чтобы, если вы явно обрабатываете исключение любого типа, кроме WebException, у вас был блок catch с базовым классом исключения, как показано ниже:

Catch(Exception ex) {

}

WebExceptionкласс создается классами, происходящими от WebRequest и WebResponse, которые реализуют подключаемые протоколы для доступа к Интернету. Подробнее об этом можно прочитать ниже в документе:

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

Надеюсь, что это поможет идайте мне знать, если вам нужна помощь в его реализации.

Тогда все ваши необработанные исключения будут обработаны в этом блоке

...