14.02.2017 Views

. Стиллмен, Дж. Грин - Изучаем C#, 2-е издание

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

исключ<strong>е</strong>ния как причина н<strong>е</strong>стабильности<br />

При отсутствии блока catch моя<br />

программа, столкнувшись с исключ<strong>е</strong>ни<strong>е</strong>м,<br />

буд<strong>е</strong>т просто остановл<strong>е</strong>на. Что<br />

ж<strong>е</strong> в этом хорош<strong>е</strong>го?<br />

^ I Основным пр<strong>е</strong>имущ<strong>е</strong>ством исключ<strong>е</strong>ний<br />

явл<strong>е</strong>тся то, что они н<strong>е</strong> дают пройти<br />

мимо пробл<strong>е</strong>мы, в больших прилож<strong>е</strong>ниях<br />

сложно сл<strong>е</strong>дить за вс<strong>е</strong>ми объ<strong>е</strong>ктами,<br />

с которыми в<strong>е</strong>д<strong>е</strong>тся работа. Исключ<strong>е</strong>ния<br />

привл<strong>е</strong>кают внимани<strong>е</strong> к пробл<strong>е</strong>мам и помогают<br />

понять причины их возникнов<strong>е</strong>ния.<br />

Появл<strong>е</strong>ни<strong>е</strong> исключ<strong>е</strong>ния в ваш<strong>е</strong>й программ<strong>е</strong><br />

пр<strong>е</strong>дупр<strong>е</strong>жда<strong>е</strong>т — что что-то ид<strong>е</strong>т<br />

н<strong>е</strong> так, как было запланировано. Мож<strong>е</strong>т<br />

быть, ссылка указыва<strong>е</strong>т н<strong>е</strong> на тот объ<strong>е</strong>кт,<br />

на который нужно, или пользоват<strong>е</strong>ль вв<strong>е</strong>л<br />

совс<strong>е</strong>м н<strong>е</strong> то знач<strong>е</strong>ни<strong>е</strong>, которо<strong>е</strong> тр<strong>е</strong>бовалось,<br />

или даж<strong>е</strong> файл, с которым в<strong>е</strong>д<strong>е</strong>тся<br />

работа, вдруг стал н<strong>е</strong>доступ<strong>е</strong>н. Подобны<strong>е</strong><br />

в<strong>е</strong>щи м<strong>е</strong>няют р<strong>е</strong>зультат работы ваш<strong>е</strong>й<br />

программы.<br />

А т<strong>е</strong>п<strong>е</strong>рь пр<strong>е</strong>дставьт<strong>е</strong>, что вы даж<strong>е</strong> н<strong>е</strong><br />

зна<strong>е</strong>т<strong>е</strong> обо вс<strong>е</strong>х этих ошибках. Пользоват<strong>е</strong>ль<br />

ж<strong>е</strong> вводит н<strong>е</strong>корр<strong>е</strong>ктны<strong>е</strong> данны<strong>е</strong><br />

и начина<strong>е</strong>т жаловаться, что прилож<strong>е</strong>ни<strong>е</strong><br />

н<strong>е</strong>стабильно. Нарушающи<strong>е</strong> работу ваш<strong>е</strong>й<br />

программы исключ<strong>е</strong>ния позволяют узнать<br />

о пробл<strong>е</strong>м<strong>е</strong> на том этап<strong>е</strong>, когда <strong>е</strong><strong>е</strong> р<strong>е</strong>ш<strong>е</strong>ни<strong>е</strong><br />

<strong>е</strong>щ<strong>е</strong> можно пров<strong>е</strong>сти относит<strong>е</strong>льно<br />

л<strong>е</strong>гко и б<strong>е</strong>збол<strong>е</strong>зн<strong>е</strong>нно.<br />

Ч<strong>е</strong>м обработанно<strong>е</strong> исключ<strong>е</strong>ни<strong>е</strong><br />

отлича<strong>е</strong>тся от н<strong>е</strong>обработанного?<br />

Ql При появл<strong>е</strong>нии исключ<strong>е</strong>ний программа<br />

начина<strong>е</strong>т искать блок catch,<br />

занимающийся обработкой. При наличии<br />

такого блока будут выполн<strong>е</strong>ны вс<strong>е</strong> полагающи<strong>е</strong>ся<br />

в случа<strong>е</strong> конкр<strong>е</strong>тного исключ<strong>е</strong>ния<br />

д<strong>е</strong>йствия. Фактич<strong>е</strong>ски, написани<strong>е</strong>м блока<br />

catch вы проводит<strong>е</strong> пр<strong>е</strong>дварит<strong>е</strong>льную<br />

работу над ошибками. Если ж<strong>е</strong> такой блок<br />

отсутству<strong>е</strong>т, программа просто пр<strong>е</strong>краща<strong>е</strong>т<br />

работу, выбрасывая окно с сообщ<strong>е</strong>ни<strong>е</strong>м.<br />

В этом случа<strong>е</strong> р<strong>е</strong>чь ид<strong>е</strong>т о н<strong>е</strong>обработанном<br />

исключ<strong>е</strong>нии.<br />

Часвдо<br />

З а д а в а <strong>е</strong> м ы <strong>е</strong><br />

Б о ц р о с ь !<br />

Зач<strong>е</strong>м указывать в блок<strong>е</strong> catch тип<br />

обрабатыва<strong>е</strong>мого исключ<strong>е</strong>ния? Разв<strong>е</strong><br />

н<strong>е</strong> б<strong>е</strong>зопасн<strong>е</strong><strong>е</strong> использовать унив<strong>е</strong>рсальный<br />

код?<br />

^ ! Б<strong>е</strong>зопасн<strong>е</strong>й вс<strong>е</strong>го вообщ<strong>е</strong> изб<strong>е</strong>гать<br />

ситуаций, в которых возникают объ<strong>е</strong>кты<br />

E x c e p tio n . Лучш<strong>е</strong> пров<strong>е</strong>сти профилактику,<br />

ч<strong>е</strong>м употр<strong>е</strong>блять л<strong>е</strong>карство.<br />

Это правило работа<strong>е</strong>т и с исключ<strong>е</strong>ниями.<br />

Попытка обработать вс<strong>е</strong> исключ<strong>е</strong>ния<br />

сразу указыва<strong>е</strong>т на плохо<strong>е</strong> программировани<strong>е</strong>.<br />

Наприм<strong>е</strong>р, лучш<strong>е</strong> воспользоваться<br />

м<strong>е</strong>тодом File .Exists () для пров<strong>е</strong>рки<br />

наличия файла, а н<strong>е</strong> обрабатывать исключ<strong>е</strong>ни<strong>е</strong><br />

FileNotFoundException.<br />

Хотя бывают исключ<strong>е</strong>ния, которых просто<br />

н<strong>е</strong> изб<strong>е</strong>жать, но большинство из них н<strong>е</strong><br />

им<strong>е</strong><strong>е</strong>т приорит<strong>е</strong>та.<br />

Иногда им<strong>е</strong><strong>е</strong>т смысл оставлять исключ<strong>е</strong>ния<br />

н<strong>е</strong>обработанными. Логика р<strong>е</strong>альных<br />

программ зачастую крайн<strong>е</strong> сложна и корр<strong>е</strong>ктно<br />

обойти ошибку н<strong>е</strong> вс<strong>е</strong>гда уда<strong>е</strong>тся,<br />

особ<strong>е</strong>нно <strong>е</strong>сли пробл<strong>е</strong>ма возника<strong>е</strong>т гд<strong>е</strong>-то<br />

там в нижн<strong>е</strong>й части кода. Обрабатывая<br />

конкр<strong>е</strong>тны<strong>е</strong> исключ<strong>е</strong>ния, изб<strong>е</strong>гая слишком<br />

общих подходов и попыток р<strong>е</strong>шить вс<strong>е</strong><br />

пробл<strong>е</strong>мы сразу, позволяя исключ<strong>е</strong>ниям<br />

всплывать, чтобы обработать их на<br />

в<strong>е</strong>рхн<strong>е</strong>м уровн<strong>е</strong>, вы сд<strong>е</strong>ла<strong>е</strong>т<strong>е</strong> свой код<br />

намного бол<strong>е</strong><strong>е</strong> стабильным.<br />

Что произойд<strong>е</strong>т, <strong>е</strong>сли н<strong>е</strong> указать<br />

тип исключ<strong>е</strong>ния рядом с ключ<strong>е</strong>вым<br />

словом c a tc h ?<br />

О! Блок catch буд<strong>е</strong>т работать с люи<br />

исключ<strong>е</strong>ни<strong>е</strong>м, которо<strong>е</strong> появится<br />

в блок<strong>е</strong> try.<br />

Но <strong>е</strong>сли блок c a t c h мож<strong>е</strong>т обрабатывать<br />

исключ<strong>е</strong>ния любых типов,<br />

зач<strong>е</strong>м мн<strong>е</strong> указывать конкр<strong>е</strong>тный тип?<br />

^ S К сожал<strong>е</strong>нию, н<strong>е</strong> сущ<strong>е</strong>ству<strong>е</strong>т<br />

унив<strong>е</strong>рсального способа обработки вс<strong>е</strong>х<br />

исключ<strong>е</strong>ний. Для устран<strong>е</strong>ния пробл<strong>е</strong>мы<br />

с д<strong>е</strong>л<strong>е</strong>ни<strong>е</strong>м на ноль в блок<strong>е</strong> catch нужно<br />

изм<strong>е</strong>нить знач<strong>е</strong>ния н<strong>е</strong>которых п<strong>е</strong>р<strong>е</strong>м<strong>е</strong>нных<br />

и сохранить н<strong>е</strong>которы<strong>е</strong> данны<strong>е</strong>.<br />

А чтобы убрать ссылку на знач<strong>е</strong>ни<strong>е</strong> null<br />

мож<strong>е</strong>т потр<strong>е</strong>боваться создани<strong>е</strong> нового<br />

экз<strong>е</strong>мпляра.<br />

Обработка ошибок происходит<br />

только в посл<strong>е</strong>доват<strong>е</strong>льности t r y /<br />

c a t c h / f i n a l l y ?<br />

й! Н<strong>е</strong>т. Можно воспользоваться набором<br />

жов c a tc h , <strong>е</strong>сли вы хотит<strong>е</strong> уч<strong>е</strong>сть<br />

различны<strong>е</strong> виды ошибок. Этого блока мож<strong>е</strong>т<br />

и н<strong>е</strong> быть вовс<strong>е</strong>. В этом случа<strong>е</strong> исключ<strong>е</strong>ния<br />

обрабатывать н<strong>е</strong> будут, просто код блока<br />

f ina 11у начн<strong>е</strong>т выполняться даж<strong>е</strong> при<br />

остановк<strong>е</strong> из-за появл<strong>е</strong>ния исключ<strong>е</strong>ния<br />

в блок<strong>е</strong> try.<br />

Н<strong>е</strong>обработанно<strong>е</strong><br />

исключ<strong>е</strong>ни<strong>е</strong> означа<strong>е</strong>т<br />

н<strong>е</strong>пр<strong>е</strong>дсказу<strong>е</strong>мую<br />

работу программы.<br />

Им<strong>е</strong>нно<br />

поэтому программа<br />

п<strong>е</strong>р<strong>е</strong>ста<strong>е</strong>т работать<br />

при их появл<strong>е</strong>нии.<br />

472 глава 10

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!