Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Питер_Гудлиф_Ремесло_программиста_Практика_написания_хорошего_кода.pdf
Скачиваний:
16
Добавлен:
19.04.2024
Размер:
9.23 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

Обнаружениеm

ошибок

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Сигналы

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

141Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Сигналы представляют собой более экстремальный механизм сообще% ния об ошибках, который широко используется средой исполнения для извещения работающей программы об ошибках. Операционная система перехватывает ряд аварийных ситуаций, таких как исключения при опе# рациях с действительными числами, генерируемые математическим сопроцессором. Эти хорошо известные события вызывают отправку приложению сигналов, прерывающих его нормальную работу и влеку% щих переход в функцию, назначенную обработчиком данного сигнала. Программа может получить сигнал в любой момент, и код должен уметь его обработать. По окончании выполнения функции обработки сигнала работа программы продолжается с того места, где она была прервана.

Сигналы – это программный эквивалент аппаратных прерываний. Это концепция, пришедшая из UNIX, которая теперь реализована на боль% шинстве платформ (базовая версия входит в стандарт ISO C [ISO99]). Операционная система предоставляет для всех сигналов разумные об% работчики по умолчанию, одни из которых ничего не делают, а другие прекращают выполнение программы, выводя краткое сообщение об ошибке. Вы можете заменить эти обработчики собственными.

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

Обнаружение ошибок

Как вы будете обнаруживать ошибку, зависит, очевидно, от механиз% ма, который сообщит о ней. На практике это значит:

Возвращаемые значения

Успешно ли выполнилась функция, определяется по возвращаемо% му ею значению. Эта проверка на отказ тесно связана с самим вызо% вом функции; подразумевается, что, выполняя его, вы проверяете, был ли он успешным. Учитывать полученный результат или нет – дело ваше.

Переменные состояния ошибки

После вызова функции нужно рассмотреть значение переменной со% стояния ошибки. Для переменной errno в модели C нет необходимо% сти проверять наличие ошибки после каждого обращения к функ% ции. Сбросьте значение errno, а затем последовательно вызовите любое число стандартных библиотечных функций. После этого по% смотрите на значение errno. Если оно соответствует коду ошибки, значит, одна из вызывавшихся функций дала сбой. Вы не узнаете, какая именно, но иногда можно воспользоваться и таким упрощен% ным способом обнаружения ошибок.

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

142m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Глава 6. Людям свойственно ошибатьсяClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Исключительные ситуации

Если одна из подчиненных функций сгенерировала исключитель% ную ситуацию, вы можете либо перехватить ее, либо игнорировать и позволить ей подняться на более высокий уровень. Обоснованное решение можно принять лишь тогда, когда известно, какие исклю% чительные ситуации могут генерироваться. Такое знание может дать вам документация (если она заслуживает доверия).

В Java исключительные ситуации реализованы так, что эта доку% ментация находится в самом коде. Программист обязан написать для каждого метода спецификацию исключений, указав, какие ис% ключительные ситуации могут генерироваться. Java – единствен% ный из основных языков программирования, который предъявляет такие требования. Исключение, отсутствующее в списке, не сможет проскочить, потому что компилятор осуществляет статическую про% верку с целью не допустить этого.1

Сигналы

Есть лишь один способ обнаружить сигнал: установить для него об% работчик. Делать это необязательно. Можно не устанавливать ника% ких обработчиков сигналов и сохранить поведение по умолчанию.

По мере того как отдельные фрагменты кода объединяются в большую систему, может возникнуть необходимость в нескольких способах об% наружения ошибок, даже в рамках одной функции. Каким бы механиз% мом обнаружения вы ни воспользовались, важно помнить следующее:

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

Полезная привычка: всегда вставлять код для обнаружения ошибок, даже если ошибки никак не влияют на дальнейшую работу вашей про% граммы. Тем самым вы дадите понять программисту, который будет сопровождать ваш код, что вам известно о возможности сбоев в функ% ции, но вы сознательно решили их игнорировать.

Когда вы позволяете исключительной ситуации передаваться через ваш код, это не игнорирование – исключительную ситуацию игнориро% вать нельзя. Вы просто разрешаете ее обработку на более высоком уров% не. Философия обработки исключительных ситуаций в этом отноше% нии совсем иная. Не вполне понятно, как правильнее всего в этом слу% чае составить документацию: написать блок try/catch, который просто заново сгенерирует исключение, написать в комментарии, что код

1C++ тоже поддерживает спецификации исключительных ситуаций, но не требует их обязательного применения. Принято уклоняться от них, в част% ности ради увеличения скорости. В отличие от Java, они вступают в силу

на этапе исполнения.