Каков наилучший способ обработки асинхронных исключений HttpWebRequest в C #? - PullRequest
6 голосов
/ 26 мая 2011

Я работаю над кодом для асинхронного использования HttpWebRequest.Если кто-то из вас когда-либо делал это раньше, то вы знаете, что обработка ошибок может быть немного болезненной, потому что если исключение выдается в одном из методов обратного вызова, оно не может быть передано обратно в вызывающий код с помощью try/ catch block.

Я хочу обрабатывать ошибки, сохраняя исключения в моем объекте состояния, который передается каждому методу обратного вызова.Если исключение обнаружено, объект состояния будет обновлен, а затем вызов http будет прерван.У меня проблема в том, что в моем объекте состояния я должен использовать свойство Exception, чтобы можно было сохранить любой тип исключения.Когда вызывающий код проверяет объект состояния и «видит» исключение, он не знает, что это за исключение.

Есть ли способ, позволяющий моему объекту состояния содержать исключение любого типа, но при этом сохранять строго типизированное исключение?

Объект состояния

public class HttpPostClientAsyncModel
    {
        public HttpResponseSnapshot Response { get; set; }
        public HttpPostClientAsyncStatus Status { get; set; }
        public Exception Exception { get; set; }
        public WebRequest Request { get; set; }
    }

1 Ответ

1 голос
/ 26 мая 2011

Объект исключения по-прежнему строго типизирован и сохраняет свои исходные значения полей. Все, что вам нужно, это проверить это так:

if (asyncModel.Exception is ArgumentException)
{
  // Handle argument exception here
  string invalidParameter = (asyncModel.Exception as ArgumentException).ParamName;
}
else if (...)
{
}

Как правило, вы все равно выполняете очень похожую проверку с блоком try / catch, так что это не должно быть неудобно. Если вы действительно обеспокоены этим, просто создайте новый поток с методами синхронизации и обработайте исключение с параметрами продолжения:

Task.Factory.StartNew(() => { DoWork(); })
.ContinueWith(t => Logger.Error("An exception occurred while processing. Check the inner exception for details", t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...