Добавил:
2200 7008 9480 6099 TKFF БЛАГОДАРНОСТЬ МОЖНО ТУТ ОСТАВИТЬ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДИПЛОМ 2025 / 4 курса_МТУСИ / 1 КУРС / Информатика / С# для чайников - Мюллер.pdf
Скачиваний:
0
Добавлен:
04.06.2025
Размер:
53.3 Mб
Скачать

ля чего н

уж

ны

искл

ю

чения

 

 

 

 

 

 

 

 

 

 

 

Д

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

t()

1 1()',,'

1)

),(

 

()',:(#

, ,

 

 

,),(

 

,:('l'l

()#_'l),(-

 

1:»_),(

,#,'),(-

,

 

,()#,#,#(h

 

 

( .

,'l),(,s'_'l'l

 

 

, ,.('

 

,1 1#(#()'l()

,'),(-

'l,1),.,,1:»_#('l#g

 

э,,'l

 

(',()'l,#()

 

1,:__:J1Y1),(d

,()#,,

,'1 1'#),(,,:

 

1:»_),(

,#),(

 

, ,

 

,.#(

,з()',з

),('),(-,#,-

 

,',,'l,

 

 

'l,'l

,()

h

1:»_#,),(- ,#,-

c'.,

 

(

,

 

1)'1)'l,

 

),( ,()'l1:»_'l(',

 

 

(# ,

,

 

,),(

,:('l'l

ci),( ,,#

 

 

 

 

 

 

 

 

 

 

 

 

,'),(-

 

 

(,

,.#(

,1 1#(#()'l()

,'),(-

 

,

 

),(,#),(,),,s(.,,a##

'l,1),.,,1:»_#('l

 

#

 

 

 

#),(

,

.#),(

(#

,,()','l),(

 

-,,:

 

,

,,

 

 

#. a','1:»_#.

,

,(

1 1'l,

,()'l1:»_'l(',

 

 

(#1)

()

()#1)),((,#

,1Y1

,(,#

 

,'((,#

 

(#

 

.'l,'((,#

 

 

 

 

,s,,

,'l,:

 

(',()'l,#()

 

 

),(,,s),(,),(,,s.,,a'l.

 

c'.,

'l,'l

c'.,

,#(-_#1 1

 

1:»_#,

,,#,,s#),(

 

()'a,#()'В 'l

),(

 

,щ ','1:»_'

 

1)'a,,'#),(,,:

(#h

a',#()_#(( .

'l,'l

 

, ,()'l(_'l,#

 

(#,,,

,

 

('l,

.gж ),('1)

,,,,s1:»_'#

 

,,#,,s#),(

,1 1#(#()'lh

()

,'),(- 'l,1),.,,1:»_#('l#_

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p,(

,(',:

 

'l,#,:

),('1)

 

,'

 

1)),(

 

,з,

 

('l

,,a,',

ci),(

 

,#),((

 

,

(,

,.#(

a('),(-

 

 

 

1:»_),(

a','1:»_'

 

(# a',#()_#('_

 

 

 

 

 

(#()'_'l,:

'l,1),.,,1:»_#('l,:

 

,

1:»_),('l

,,#1 1,'

,,s1:»_r

1,:__:J1Y1,d

_#

,

a,()'),(' 1)

,'

 

_'l,з1)'lщ

p,('1)

 

#,,'l

,,

 

,

.#),(#

,з()',з

 

),('),(-'l,r

1),.,,1:»_#('l#

 

,(,s),(()'l

,#),(

,'л ,',

 

(,s.(

,,#,'),(-

 

ci),(

'

(#

'l,,

,-a ,'),(-

 

 

 

 

 

 

 

 

 

'l,1),.,,1:»_#('l#

 

,,#,),(

 

 

(','l,'('l,:

 

 

 

1Y1 () _#1 1

1)

,'g уж

,

,('l),(#,-(,#

 

 

'l,#'l

 

1)

()()#1)),((

 

,()'l,#(#('l'l

 

 

'l,1),.,,1:»_#('l.

 

,

 

.(

,

1:»_#(),(,s),(-

'la

 

 

,),('),(-'l

 

,

 

',()#,,s

хii

 

s

 

 

 

аirs Сr isi

iri

 

 

iаi

 

i

amRsi

аamR а

 

 

 

r

 

siСi si

 

amRri

иr

 

si

 

iСr i s

 

 

 

 

 

 

 

 

Исключительный пример

 

 

 

 

 

 

 

 

 

 

 

 

 

ж ,#,

(,),(()'_'l

((

.

 

,()

1 1()',,#

 

 

 

ramRi иamR r

 

iС,()'l,#,#(,i

 

1),.,,1:»_#,,#

 

ci,#,#(),(,

,#1Y1'('la,'

 

'l,1),.,,1:»_#(

 

'l.

g

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

,B

,B

Ич

,B

ДРД

B.:@Jg

'g : .#"1,: _ а'l"1В'l (,:,:),('l "1,:(#),(_ #( _9

ГЛАВА 9 Эти исключительные исключения яббt

Эта "исключительная" версия функции Main ( ) практически полностью на­ ходится в trу-блоке. Блок catch в конце функции Main ( ) перехватывает объект ArgumentException и использует его метод ToString ( ) для вывода информа­ ции об ошибке, содержащейся в этом объекте в виде строки. В примере ис­ пользован класс ArgumentException, поскольку это исключение наиболее точ­ но описывает ситуацию: неприемлемый аргумент метода Factorial ( ) .

Что делает этот пример "исключительным"

Этот метод Factorial ( ) включает проверку на отрицательность передан­ ного аргумента. Если аргумент отрицателен, метод Factor ial ( ) не может продолжать работу; он формирует сообщение об ошибке с описанием ситу­ ации, включая само отрицательное значение, вызвавшее ошибку. Затем ме­ тод Factorial ( ) вносит информацию во вновь создаваемый объект типа ArgumentException, который передается с помощью механизма исключений вызывающей функции.

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

СОВЕТ

=

 

,:

 

 

.-y

 

 

 

 

=

 

ко:

 

K z-y

 

 

 

 

=

 

{ :

 

 

чp

 

 

 

 

:

>

C:

 

 

,

 

 

 

 

:

-

, :

 

 

ч

 

 

 

 

::

 

u : :

 

"

u

 

 

 

 

6

 

г ",- )-т

 

 

 

:щ) рхEщ­r:

 

 

=рй-

]чимcщs

т-

:им

 

щ

 

:щ)

рщищ: wnoим

 

 

щ

 

) и З) щтщир1щищгЗ; щ) рщищ:

rЗ-хр1хщг1 )

r:г им, , D

 

 

;щ)

рщи:щ. w )-т

:римG -чр1щищг й "щ:имn 6

щи1:имl Л щх1 т :им

 

 

 

) p З) щтщирщищг1

З; щ)

рщи:щ-rЗхр1щищг. )

r:сим, к о )

 

 

 

 

(-им

-чi

 

 

 

, . .

234 ЧАСТЬ 1 Основы программирования на С#

Впервых нескольких строках выводятся корректно вычисленные фактори­ алы чисел от 6 до О. Попытка вычислить факториал для -1 приводит к генера­ ции исключения.

Впервой строке сообщения об ошибке выводится информация, сгенериро­ ванная в функции Factorial ( ) . Эта строка описывает природу ошибки, вклю­ чая вызвавшее неприятности значение аргумента - ] .

Трассировка стека

В оставшейся части вы вода выполняется ­з глррз. .П.гл р­в.глЭ В первой строке указывается, в какой функции сгенерировано исключение. В данном случае это было сделано в функции Factorial ( int ) , а именно - в строке 23 исходного файла Program . cs. Функция Factorial ( ) была вызвана из функции Main ( string [ J ) в строке 56 того же файла. На этом трассировка файла прекра­ щается, поскольку функция Main ( ) содержит блок, перехвативший и обрабо­ тавший указанное исключение.

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

СОВЕТ

СОВЕТ

Выполнив предыдущий пример и просмотрев содержи мое стека вы­ зовов, выведенное на консоль, вы увидите метод Main ( ) в x. xв части листинга. Я же обычно предпочитаю рассматривать вызываю­ щие функции как находящиеся над вызываемыми, как было показано на рис. 9. 1 .

Возврат дополнительной информации наподобие стека вызовов очень полезен при разработке приложения, но вряд ли стоит показы­ вать его пользователям в конечной версии. Тем не менее даже в этом случае его можно записывать в журнальный файл.

Пока программа работает в отладчике, трассировка стека доступна в одном из окон отладчика Yisual Studio.

СОВЕТ

я ециг ннrйиоюзмоз етrг хтнaмоь дощекг rти йм

Как у поми налось ранее, вы м ожете определить собственные тип ы исключений. Предположим, в ы определили класс CustomException. Этот класс может иметь, например, следующий вид:

ГЛАВА 9 Эти исключительные исключения 235

Вы можете использовать эту схему в качестве основы для любого поль­ зовательского исключения, которое вы хотите создать. Здесь нет никакого специального кода (если только вы не захотите его добавить); записи ае ыдз. ц . означают, что шW)W.код использует код из жгыйднхы. pьдяйраи,.То, что вы види­ те здесь, - это проявление наследования. Другими словами, пока что вам не нужно слишком беспокоиться о том, как работает это пользовательское исклю­ чение.

Теперь рассмотрим конструкцию ьевьпп.

·c

 

Е,i

l'l

­ сi К

ыл

,

l) ­l

'l

­

iс К в

cK

c­оP

i

cl Е

К

Что произойдет, если жандeвпдеедвпан.з усгенер. ирует простое исключение ыpьдяйраи. или какое-то другое исключение, отличное от тCыйаныpьдяйраии. Это будет выглядеть как игра в футбол бейсбольным мячом: ворота не будут соответствовать мячу.

236 ЧАСТЬ 1 Основы программирования на С#

К счастью, С# позволяет программе определять несколько кон­ струкций catch, каждая из которых предназначена для своего типа исключения. Вы можете использовать их одну за другой, выстроив несколько конструкций catch для разных типов исключений одну за другой после блока try. С# последовательно проверяет каждый блок catch, сравнивая сгенерированное исключение с типом аргу­ мента catch, как показано в следующем фрагменте кода:

т

E)

сE,m

6сгm,", 3сm, т у

 

 

 

ч

 

 

 

 

 

6сmди,,

3,ч", 3сm,т у W

 

)3 nс

 

ди, сm),т Eсmк у цц

 

 

цц

 

с

ди,сm),т Eсmкт

 

 

цц

 

 

 

 

цц

)3 n,

),т

Eсmкт Н

цц

 

 

 

цц

 

д

,

 

 

цц

 

Если метод SomeOtherMethod ( ) сгенерирует объект Exception, он прой­ дет через catch ( CustomException ) , так как Exception не является типом

CustomException. Это исключение будет перехвачено следующей конструкци­ ей catch, а именно - catch ( Exception ) .

Всегда располагайте саtсh-блоки от наиболее специализированного к наиболее общему. Никогда не размещайте более общий блок пер­ вым, как это сделано в приведенном фрагменте исходного текста:

ищслущсзрВ

т

E)

сE,m 6сгm,",

3сm, u Н

 

 

 

 

 

 

 

 

х

 

 

 

 

 

 

 

 

 

6сmг,,

3,х",

3сm,n НV

 

 

 

 

)3 n,

), т

Eктсmг, у

цц

­

e

 

 

 

цц

 

 

с

г, с),mт

сEmкт

 

 

 

)3 нс

г, сm),т

Eсmкт у

 

 

 

 

 

цц

 

 

 

 

­

 

 

 

 

цц

 

 

 

 

 

 

ГЛАВА 9 Эти исключительные исключения 237

 

Et!B !!

!!.i!.ii !!!.i!!!,;Ee!B

 

C u s t omEx c ep t i on, dх лd в­в

d

 

CustomException:

 

 

 

 

ЗАПОМНИ!

b L '

, lb®L

i bl ®

G

 

i bl °":

 

 

uu

ссс

8

с ) с

 

 

 

 

вкот

catch дкя ваии CustomExcept ion иещесеиваво­yетв MySpecial

Exception, тит кяtбнти нбсб о о о

 

 

 

 

Планирование стратеrиr,, обР:с1б т и ошибок

 

­­r1а­1

-БЖ­-.р­1ВВ rВ..Б

РВ

РЗа1­1r,,.. rВ.Кб Б-r,,Ов З1r,, -

­1

-КЖ-r r -ЖР -Зба-з1r,,rРЖЗим.

.r,,rв зВ.РК-Ж-И-з r -Ж БК--ЗбЖ-

.­з-­. . .r,,r.

r,,-И1З.Ж-r,,. -РЗ.Иr,,..

 

 

Вопросы, помоrающие при планировании

 

rd( d(2d(Ф! ..# ad!Fd(--1.#.1#.

61# 6d#-1.#d6(,3 6 a(-1,( )#.!,!d0#

 

6(6)0#

6!ad!10

 

 

 

 

 

 

 

>>Что может пойти не так? Спрашивайте себя об этом при работе над

каждым фрагментом кода.

»Если что-то идет не так, могу я исправить ситуацию? Если да, то

., вы можете восстановить нормальное состояние программы и про­

, , ,·.i должить ее работу. Если нет, то, пожалуй, вам следует паковать че­ моданы. . .

»Подвергаются пи данные пользователя риску? Если да, вы долж­

ны сделать все, что в ваших силах, для предотвращения потери или повреждения данных. Осознанно выпускать программу, которая в состоянии повредить пользовательские данные, - преступная ха­ латность.

>>Где следует разместить обработчик исключения для данной си­ туации? Попытка обработать исключение в методе, в котором оно

сгенерировано, - не всегда лучшее решение. Часто некоторый дру­ гой метод в цепочке вызовов имеет больше информации и в состоя­ нии более интеллектуально и эффективно справиться с возникшей ситуацией. Размещайте блоки try/ catch так, чтобы блок try охва­ тывал вызовы, в которых возможна генерация исключений.

238 ЧАСТЬ 1 Основы программирования на С#

Соседние файлы в папке Информатика