Где WebExceptionStatus — это перечисление, которое содержит приведенные ниже значения.

 

CacheEntryNotFound

 

ConnectFailure

 

ConnectionClosed

 

KeepAliveFailure

 

MessageLengthLimitExceeded

 

NameResolutionFailure

 

Pending

 

PipelineFailure

 

ProtocolError

 

ProxyNameResolutionFailure

 

ReceiveFailure

 

RequestCanceled

 

RequestProhibitedByCachePolicy

 

RequestProhibitedByProxy

 

SecureChannelFailure

 

SendFailure

 

ServerProtocolViolation

 

Success

 

Timeout

 

TrustFailure

 

UnknownError

 

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

 

Исключения, генерируемые методом GetResponseStream ()

Для соединения по протоколу HTTP метод GetResponseStream () из класса WebResponse может сгенерировать исключение ProtocolViolationException, которое в целом означает, что в работе по указанному протоколу произошла ошибка. Что же касается метода GetResponseStream (), то это означает, что ни один из действительных ответных потоков недоступен. Исключение ObjectDisposedException генерируется в том случае, если ответ уже утилизирован. А исключение IOException, конечно, генерируется при ошибке чтения из потока, в зависимости от того, как организован ввод данных.

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

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

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

Using System; using System.Net; using System.10;

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=l; ; i++) { ch = istrm.ReadByte(); if(ch == -1) break;

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

Console.Write ("ХпНажмите клавишу <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, что и подтверждает приведенный выше результат.