Читать «C# 4.0: полное руководство» онлайн - страница 658

Герберт Шилдт

Обработка исключений

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

// Пример обработки сетевых исключений.

using System;

using System.Net;

using System.IO;

class NetExcDemo {

  static void Main() {

    int ch;

    try {

      // Сначала создать объект запроса типа WebRequest по указанному URI.

      HttpWebRequest req = (HttpWebRequest)

              WebRequest.Create("http://www.McGraw-Hill.com");

      // Затем отправить сформированный запрос и получить на него ответ.

      HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

      // Получить из ответа поток ввода.

      Stream istrm = resp.GetResponseStream();

      /* А теперь прочитать и отобразить гипертекстовое содержимое, полученное по указанному URI. Это содержимое выводился на экран отдельными порциями по 400 символов. После каждой такой порции следует нажать клавишу <ENTER>, чтобы вывести на экран следующую порцию, состоящую из 400 символов. */

      for (int i = 1; ; i++) {

        ch = istrm.ReadByte(); if (ch == -1) break;

        Console.Write((char)ch); if ((i % 400) == 0) {

          Console.Write("\nНажмите клавишу <Enter>.");

          Console.ReadLine();

        }

      }

      // Закрыть ответный поток. При этом закрывается // также поток ввода istrm.

      resp.Close();

    }

    catch (WebException exc) {

      Console.WriteLine("Сетевая ошибка: " + exc.Message +

             "Код состояния: " + exc.Status);

    }

    catch (ProtocolViolationException exc) {

      Console.WriteLine("Протокольная ошибка: " + exc.Message);

    }

    catch (UriFormatException exc) {

      Console.WriteLine("Ошибка формата URI: " + exc.Message);

    }

    catch (NotSupportedException exc) {

      Console.WriteLine("Неизвестный протокол: " + exc.Message);

    }

    catch (IOException exc) {

      Console.WriteLine("Ошибка ввода-вывода: " + exc.Message);

    }

    catch (System.Security.SecurityException exc) {

      Console.WriteLine("Исключение в связи с нарушением безопасности: " + exc.Message);

    }

    catch (InvalidOperationException exc) {

      Console.WriteLine("Недопустимая операция: " + exc.Message);

    }

  }

}

Теперь перехватываются все исключения, которые могут быть сгенерированы сетевыми методами. Так, если изменить вызов метода Create() следующим образом:

WebRequest.Create("http://www.McGraw-Hill.com/moonrocket");

а затем перекомпилировать и еще раз выполнить программу, то в результате может быть выдано приведенное ниже сообщение об ошибке.

Сетевая ошибка: Удаленный сервер возвратил ошибку: (404) Не найден.

Код состояния: ProtocolError

На веб-сайте по адресу www.McGraw-Hill. com отсутствует раздел moonrocket, и поэтому он не найден по указанному URI, что и подтверждает приведенный выше результат.

Ради краткости и ясности в программах большинства примеров из этой главы отсутствует полноценная обработка исключений. Но в реальных приложениях она просто необходима.