Г. Шилдт - С#4.0 Полное руководство (1160795), страница 209
Текст из файла (страница 209)
Свойство Кеяропяе объявляется следующим образом. рпЫ1с ИеЬКеяропяе Кеяропяе ( Чеш ) Когда возникает ошибка, то с помощью свойства Бгасия типа ИеЬЕхсерС1оп можно выяснить, что именно произошло. Это свойство объявляется следующим образом: рнЫьа НеЬЕхсеряьопяяагня Бгаяня (Чею ) где ХеЬЕхсергьопБ Саги я — это перечисление, которое содержит приведенные ниже значения. Соппесягопс1ояес( Соппесяга11пге СаспеЕпягуиоягоппг) МеяяаэеьепЧСЬ11т1СЕхсеес)ег) Кааеаеяа1нг1опГа11иге КеерЛ11неГа11вге Ргогосо1Еггог Репг)1п Рьре11пеГа11пге Ргохукяпекеяо1пгаопГа11пге Кесягнега11иге Кеэпеяясапсе1еп' КеЧиеяСРгоЫЬггеПВуСаспеРо11су КеэпеяСРгопгЫСег)ВуРгоху БесигеСпаппе1Гя11пге БегнегРготосо1Н1о1агьоп Бпссеяя Бепс)га11пге ОпхпонпЕггог Тгиягга11пге Тппеосв Как только будет выяснена причина ошибки, в программе могут быть предприняты соответствующие действия.
Исключения, генерируемые методом 6еЖевропвеЯТгевв(() Для соединения по протоколу НТТР метод Оесреяропяеэсгеат () из'класса ХеЬКеяропяе может сгенерировать исключение РгоСосо1уьо1а11опЕхсерсаоп, которое в целом означает, что в работе по указанному протоколу произошла ошибка. Что же касается метода ОесреяропяеБСгеав (), то это означает, что ни один из действительных ответных потоков недоступен. исключение Оьб ессраярояес(ехсерсгоп генерируется в том случае, если ответ уже утилизирован.
А исключение 1ОЕхсерпаоп, конечно, генерируется при ошибке чтения из потока, в зависимости от того, как организован ввод данных. Обработка исключений В приведенном ниже примере программы демонстрируется обработка всевозможных сетевых исключений, которые могут возникнуть в связи с выполнением программы из предыдущего примера, в которую теперь добавлены соответствующие обработчики исключений. Глава 26.
Сетевые средства подю)юченин к Интернету 1023 Пример обработки сетевых исключений. ця1пп Яуявеш( цятпп Яуясеш.нел) ця1пс Яуясеш.тб; с1аяя Иеавхсбещо ( ялас1с тога Ма1п() ( 1пг сты ггу ( // Сначала создать объект запроса типа ИеЬРепцеяс по указанному ПВ1. Нссрвеьве Р еяс геп = (НССрневвейцеяа) ИеЬНесцеяс.сгеасе("ЬГГр://ннн.исСган-н111.сош")( // Затем отправить сформированный запрос и получить на него о~нет. НГСрнеЬНеяропяе геяр = (НГГрнеЬКеяропяе) гейсЯепнеяропяе()( // Получить из ответа поток ввода.
Я<геаш 1ясгш = геярсаеонеяропяеБГгеаш() /* А теперь прочитать и отобразить гипертекстовое содержимое, полученное по указанному ПН1. Зто содержимое выводится на экран отдельными порциями по 400 символов. После каждой такой порции следует нажать клавишу <ЕИТЕН>, чтобы вывести на экран следукщую порцию, состоящую из 400 символов.
*/ Рог(спв 1=1( т 1+4) ( сл = Еяцшп.реадВусе()( 11(сЬ == -1) Ьгеауи Сопяо1е.нгссе ( (сбаг) сЬ); 11((1%400) ==О) ( сопяо1е.игтсе("1пнажмите клавишу <епсег>.")( Сопяо1е.неаб01пе()( ) ) // Закрыть ответный поток. При этом закрывается О также поток ввода 1я<гш. геяр. С1ояе () ( ) са<сЬ (Иеовхсерс1оп ехс) ( Сопяо1е.нг1ае11пе("Сетевая ошибка: " + ехс.иеяяасе "1пкод состояния: " ь ехс.Бгагця); сассЬ(Ргососо1чго1апгопЕхсерстоп ехс) Сопяо1е.нггсеьтпе("Протокольная ошибка: " ь ехс.Меяяапе); ) сагсь(пгароппасехсерс1оп ехс) ( Сопяо1е.нгтте11пе("Ошибка формата ПН1: " + ехс.Меяяаде)) ) сассь(иогяцрроггеоехсергсоп ехс) ( сопяо1е.иггсе11пе("неизвестный протокол: " + ехс.незвале)( сассЬ(1ОЕхсерптоп ехс) ( Сопяо1е.нггпеьгпе("Ошибка ввода-вывода: " + ехс.неяяасе)( ) сассЬ(Яуясеш.Бесцгтцу.БесцгтцуЕхсерсгоп ехс) Сопяо1е.нг1се11пе("Исключение в связи с нарушением безопасности: ехс.Меяяасе)( 1024 Часть!1.
Библиотека 0(г ) сасоь (гдта1гсюрегасгооЕхсервгоп ехо) Соово1е.иг1Ге11ле("Недопустимая операция: " т ехс.мевваде); ) ) Теперь перехватываются все исключения, которые могут быть сгенерированы сетевыми методами. Так, если изменить вызов метода Сгеасе () следующим образом: Не)зкедоезо.сгеаге(СЬГГр."//нин.иооган-н111.сош/шоолгоокес")4 а затем перекомпилировать и еще раз выполнить программу, то в результате может быть выдано приведенное ниже сообщение об ошибке. Сетевая ошибка: Удаленный сервер возвратил ошибку: (404) Не найден. Код состояния: Ргогосо1Еггог На веб-сайте по адресу ими. Мс6 гам-Н111 .
Сош отсутствует раздел шо алгос)ге С, и поэтому он не найден по указанному 13Е1, что и подтверждает приведенный выше результат. Ради краткости и ясности в программах большинства примеров из этой главы отсутствует полноценная обработка исключений. Но в реальных приложениях она просто необходима. КЛаСС 0Г2. Как следует из табл. 26.1, метод Ме)зрег)цезг. Сгеасе () существует в двух вариантах. В одном варианте он принимает идентификатор 1.)Е1 в виде строки. Именно этот вариант и был использован в предьгдущих примерах программ.
А во втором варианте этот метод принимает идентификатор 1(Е! в виде экземпляра объекта класса Нг1, определенного в пространстве имен Я уз Сеш. Класс Нгг инкапсулирует идентификатор 11Е(. Используя класс ()г г, можно сформировать 1)Е1, чтобы затем передать этот идентификатор методу Сгеасе () . Кроме того, идентификатор УЕ( можно разделить на части. Для выполнения многих простых операций в Интернете класс Нг г малопригоден. Тем не менее он может оказаться весьма полезным в более сложных ситуациях сетевого подключения к Интернету. В классе ()гг определяется несколько конструкторов.
Ниже приведены наиболее часто используемые конструкторы этого класса. рцЫго Нг1 (всггод цгззсгзлд) рцЫго Нгь(огг )завецг1, всггдд гегаг/кецг1) В первой форме конструктора объект класса Нгг создается по идентификатору 11Е), заданному в виде строки игзясг1лд. А во второй форме конструктора он создается по относительному 11Е1, заданному в виде строки ге1а С/це(/г1 относительно абсолютного 11Е1, обозначаемого в виде объекта )зазеУг1 типа Нг1.
Абсолютный с)Е1 определяет полный адрес 11Е1, а относительный 1.)Е1 — только путь к искомому ресурсу. В классе ()г1 определяются многие поля, свойства и методы, оказывающие помощь в управлении идентификаторами 13Е( или в получении доступа к различным частям 1)Е1. Особый интерес представляют приведенные ниже свойства. Глава 26.
Сетевые средства подключения к Интернету 2.025 Свойство Описание рпЬ11с БСг1пс Нояг ( ь(ЕС; ) рсЫьс БСг1пс Ьоса1раСЬ ( сеС) рыЫ1с БСг1пс РаСЬАпг(Снегу ( сеС) ) рпЬ11с 1ПС Рогг ( сгеС; ) Получает имя сервера Получает локальный путь к файлу Получает абсолютный путь и строку запроса Получает номер порта для указанного про- токола. Так, для протокола НТТР номер порта равен 80 Получает строку запроса Получает протокол рпЫЬс БСг1пд Снегу ( сеС) ) рсЬ11с ясг1по БСЬегле ( сес) Перечисленные выше свойства полезны для разделения ()Е) на составные части.
Применение этих свойств демонстрируется в приведенном ниже примере программы. // Пример применения свойств из класса Пг1. вятпэ Яуягеи; оя1пэ Буягеи.нег; с1аяя Пгьпеио ( ясагдс чогд Мвтп() ( Пг1 яаер1е = пен Пг1("ссср://НегЬЯсн116С.сои/яоиет11е.гхС?Боиеоыегу")г Сопво1е.нгссеЬЬпе("Хост: " ь яаир1е.Нояг)г сопяо1е.игтсеььпе("порт: " + яап1Р1е.Ротс)) Сопяо1е.Игсгеььпе("Протокол: " Ь яагар1е.Беседе)г Сопяо1е.игсгеЬЬпе (" Локальный путь: " ь яатр1е.ьоса1РаСЫ; сопво1е.иг1сеььпе("запрос: " + яапр1е.снегу)) Сопяо1е.ИгзгеЬ1пе("Путь и запрос: " ь яаир1е.раСЫннзрнегу)) ) ) Эта программа дает следующий результат. Хост: НегЬЯсш1ЖС.сои Порт: 80 Протокол: ЬССР Локальный путь: /яоие111е.гхг Запрос: ?Ботеооегу Путь и запрос: /яоие111е.гхг?Яоиейнегу Доступ к дополнительной информации, получаемой в ответ по протоколу НПР С помощью сетевых средств, имеющихся в классе нссриеьнеяропяе, можно получить доступ к другой информации, помимо содержимого указываемого ресурса.
К этой информации, в частности, относится время последней модификации ресурса, а также имя сервера. Она оказывается доступной с помощью различных свойств, связанных с получаемым ответом. Все эти свойства, включая и те что, определены в классе ИеЬНеяропзе, сведены в табл. 26.5. В приведенных далее примерах программ демонстрируется применение этих свойств на практике. 102б Часть!1.
Библиотека С(т Таблица 26.5. Свойства, определенные в классе НггрхеЬНевропве Свойство Описание рпЬ11с яггдпд СЬагасгегЯег ( дег; ) Получает название используемого набора символов Получает название схемы кодирования рпЫдс вггдпд СопгепгЕпсос(1пд ( дег; ) рпЬ11с 1опд Сопгепг1епдгЬ ( дег( ) Получает длину принимаемого содержимого. Если она недоступна, свойство имеет значе- ние -1 Получает описание содержимого Получает или устанавливает список ооон(е- наборов, присоединяемых к ответу Получает коллекцию заголовков, присоединяе- мых к ответу Принимает логическое значение ггпе, если запрос получен из кеша. А если запрос достав- лен по сети, то принимает логическое значе- ние га1яе Принимает логическое значение ггпе, если клиент и сервер опознают друг друга, а ина- че — принимает логическое значение 1а1яе Получает время последней модификации ре- сурса Получает строку, которая задает способ ответа Получает обьект типа уегя1оп, описываю- щий версию протокола НТТР, используемую в транзакции Получает ()Н), по которому был сформирован ответ.
Этот идентификатор может отличаться от запрашиваемого, если ответ бьв переадресо- ван по другому () Н) Получает строку, обозначающую имя сервера Получает объект типа нггрягагпясос)е, опи- сывающий состояние транзакции Получает строку, обозначающую состояние транзакции в удобочитаемой форме рпЫ1с яггупд Сопгепгтуре ( дег; рпЫус СоокгеСо11есг1оп Соок1ея ( дег; вег; рпЬ11с ХеЬНеабегСо11есг1оп Неасехв( дег; ) рпЬ11с Ьоо1 1яГгоеСаспе ( дег; ) роЬ11с Ьоо1 тянпгпа11удггпепгдсагео ( дег; рпЫ1с Рагетдве Ьаягиос(11(ес( ( дег; рпЫус вггдпд Мегкос ( дегт рпЬ11с уегвдоп Ргогосо1уехв1оп ( дег; ) рпЫ1с Рг1 Неропяецгу ( дег; рпЬ11с рпЫдс ( дег; рпЫдс ( дег; вггдпд Яегчег ( дег; ) НггрЯгагпяСос(е ЯгагпвСос(е вггьпд ЯгагпвРевсгзргуоп Доступ к заголовку Для доступа к заголовку с информацией, получаемой в ответ по протоколу НТТР, служит свойство неас(ехя, определенное в классе нггрхеьйеяропяе. рпЫ1с ХеЬНеаоетоощесгьоп Неабегя( дег; ) Заголовок протокола НТТР состоит из пар "имя-значение", представленных строками.