310______________________________________________Глава 4

Рис. 4.27                   .

Сообщение отладчика об исключении         й;|^^"рйта^е«1®жййам8Ео.»в^нои1ьп1»1»зд»'онВй

||^^^ ^zwa'.i^oces^tkffped Ute^ep ев йцп'с-cMitiniJe.              '^':•••-

..•''.   '^:::::i .i::/"'. '                  ./i':::^''!'''   :     '            :'•."'                   !

мяти, незакрытые файлы, не уничтоженные временные файлы на диске и прочий
«мусор». Например, пусть вы выполняете некоторую программу, в которой имеют-
ся следующие операторы:

FILE *fp;

int size;

char *str;

fp = fopen("a.tmp", "w");

fprintf (fp, "файл a.tinp");

str = (char *) malice(size);

<операторы, в которых может обнаружиться исключительная ситуация>

remove("а.tmp") ;

free(str) ;

Вы открываете временный файл (см. раздел 12.9.2 главы 12) с именем a.tmp,
чтобы хранить в нем какие-то промежуточные данные вычислений. В конце рабо-
ты вы намерены уничтожить его процедурой remove. Вы динамически выделяете
(см. раздел 11.9 главы 11) некоторую память процедурой malloc, намереваясь
освободить ее, когда она вам больше не будет нужна, процедурой free. Но если в
промежуточных операторах возникнет исключение, то вычисления прервутся и
процедуры remove и free не будут выполнены. В результате память, выделенная
процедурой malloc останется недоступной, а на диске сохранится временный и
уже ненужный файл a.tmp.

Помимо указанного, стандартная обработка исключений программой имеет
еще один недостаток — пользователь остается в полном недоумении, что же ему
дальше делать? И не только не очень квалифицированный пользователь, которого
приведенные на рис. 4.26 сообщения на английском языке могут повергнуть в
шок. Даже опытному человеку невозможно порой догадаться, что же в вашей про-
грамме делится на нуль и как этого можно избежать. Наверное, каждый попадал в
подобные ситуации, даже применяя профессионально сделанные программы,
включая Windows.

4.9.2 Способы работы с исключениями

Избежать всех этих неприятностей можно несколькими путями:

1. Не допускать исключений, производя предварительную проверку каждой
операции, способной привести к исключительным ситуациям              ':

2. Защитить код зачистки «мусора» с помощью блока try ... _finally

3. Обработка исключений в блоках try ... except                           ^

Хороший стиль программирования ————————————————————————

Программист должен принять все мыслимые меры, чтобы ни при каких ошибках пользова-
теля и ни при каких сочетаниях данных приложение не заканчивалось бы аварийно. Но если
все-таки аварийное завершение происходит, необходима полная зачистка «мусора» - уда-
ление временных файлов, освобождение памяти, разрыв связей с базами данных и тд.

Конечно, не всегда все это можно выполнить на все 100 процентов. Каждый
знает, что даже в Windows случаются аварийные завершения, после которых оста-