Правильно обрабатывать два WebException - PullRequest
18 голосов
/ 16 апреля 2010

Я пытаюсь правильно обработать два разных WebException.

Обычно они обрабатываются после вызова WebClient.DownloadFile(string address, string fileName)

AFAIK, пока есть два, с которыми я должен справиться, оба WebException:

  • Не удалось разрешить удаленное имя (т. Е. Отсутствует сетевое подключение к серверу доступа для загрузки файла)
  • (404) Файл не является существительным (то есть файл не существует на сервере)

Может быть и больше, но это то, что я нашел наиболее важным на данный момент.

Так, как я должен справиться с этим правильно, так как они оба WebException, но я хочу обработать каждый случай выше по-разному.

Это то, что я имею до сих пор:

try
{
    using (var client = new WebClient())
    {
        client.DownloadFile("...");
    }
}
catch(InvalidOperationException ioEx)
{
    if (ioEx is WebException)
    {
        if (ioEx.Message.Contains("404")
        {
            //handle 404
        }
        if (ioEx.Message.Contains("remote name could not")
        {
            //handle file doesn't exist
        }
    }
}

Как вы видите, я проверяю сообщение, чтобы увидеть, что это за тип WebException. Я бы предположил, что есть лучший или более точный способ сделать это?

Спасибо

1 Ответ

27 голосов
/ 16 апреля 2010

Исходя из этой статьи MSDN , вы можете сделать что-то вроде следующего:

try
{
    // try to download file here
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError)
    {
        if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotFound)
        {
            // handle the 404 here
        }
    }
    else if (ex.Status == WebExceptionStatus.NameResolutionFailure)
    {
        // handle name resolution failure
    }
}

Я не уверен, что WebExceptionStatus.NameResolutionFailure - это ошибка, которую вы видите, новы можете просмотреть выбрасываемое исключение и определить, что означает WebExceptionStatus для этой ошибки.

...