Глава 22. Обработка исключительных ситуаций_______________________629
Если программа во время обработки находит в файле какие-либо ошибки, то появляется соответствующее сообщение и программа завершается.
Краткий обзор функционирования программы. Стратегия работы приложения ExpSum весьма проста. Программа получает из командной строки имя файла расходов, открывает файл и считывает начальное значение, которое указывает, сколько записей о служащих содержится в файле. Затем в цикле соответствующее число раз вызывается функция ProcessEmployee ().
Внутри функции processEmployeet) программа считывает из файла следующую запись о служащем и выводит на экран начальную информацию о нем (порядковый номер, имя, адрес, и т. д.). Среди прочей информации, которой располагает класс Employee, находится, в частности, количество непогашенных статей расходов служащего. Для каждого служащего функция processEmpicyes!) соответствующее число раз вызывает функцию
ProcessExpenseItemO. ФУНКЦИЯ ProcessExpenseItemO работает аналогично ProcessEmployeeO. Эта
функция считывает из файла следующую статью расхода и выводит ее на экран. Пройдя по всему файлу, программа выводит на экран некоторые заключительные итоги и закрывает входной файл.
Обработка ошибок в ExpSum 1. Программа ExpSumI для обработки ошибок использует стратегию, которая была рассмотрена выше в разделе "Возврат значений ошибки через аргументы функций". При вызове
ProcessEmpioyee() ИЛИ ProcessExpenseItemO Среди ПрОЧИХ аргументов функ-
ции передается переменная кода ошибки. При появлении проблем функция выводит на экран сообщение, изменяет .значение переменной ошибки, и возвращает управление обратно вызывающей функции. Та, в свою очередь, получив управление, проверяет переменную ошибки и так далее. Этот процесс продолжается до тех пор, пока управление не возвращается в функцию main (), где программа завершается.
Хотя эта программа работоспособна, предложенный путь явно не лучший. Коды ошибок возвращаются по цепочке вызовов, подобно большому грузовику, который въехал в узкий тупик и пытается вернуться. Такая стратегия приводит к тому, что программа, перехватив и обработав ошибку, должна затем повторно обработать ее в каждой точке последовательности вызова. Это раздувает и затуманивает программу. Получается код, который тяжело читать, тяжело сопровождать, а это означает, что отследить его дефекты тоже тяжело.
Обработка ошибок, жестко зашитая в ExpSumI, является к тому же и не гибкой. Предположим, например, что впоследствии вы захотите при обнаружении ошибки возвращать в main () идентификатор служащего. Для этого вам придется серьезно переделать программу и тем самым, не исключено,