. Стиллмен, Дж. Грин - Изучаем 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