Для соединения по протоколу HTTP метод GetResponseStream()
из класса WebResponse
может сгенерировать исключение ProtocolViolationException
, которое в целом означает, что в работе по указанному протоколу произошла ошибка. Что же касается метода GetResponseStream()
, то это означает, что ни один из действительных ответных потоков недоступен. Исключение ObjectDisposedException
генерируется в том случае, если ответ уже утилизирован. А исключение IOException
, конечно, генерируется при ошибке чтения из потока, в зависимости от того, как организован ввод данных.
Обработка исключений
В приведенном ниже примере программы демонстрируется обработка всевозможных сетевых исключений, которые могут возникнуть в связи с выполнением программы из предыдущего примера, в которую теперь добавлены соответствующие обработчики исключений.
// Пример обработки сетевых исключений.
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 символов. После каждой такой порции следует нажать клавишу
for (int i = 1; ; i++) {
ch = istrm.ReadByte(); if (ch == -1) break;
Console.Write((char)ch); if ((i % 400) == 0) {
Console.Write("\nНажмите клавишу
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) Не найден.