636_______________________Часть IV. Новые возможности С++

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

Заметьте, что ни один из обработчиков не останавливает выполнение программы. Хотя серьезные ошибки часто требуют остановки программы, у ExpSum2 есть веская причина не делать этого. Взгляните на последнюю строку программы:

/'/ Закрыть входной файл — готово! infile.. close() ;

Хотя потоки C++ "знают", что при удалении они должны закрыться (если они открыты), но тем не менее вы должны закрыть их явно. В нашем случае это легко сделать. Более важно то, что теперь вам не приходится организовывать закрытие файла во всех рассыпанных по программе проверках переменных ошибки. Посмотрим, например, на один из фрагментов функции main () из программы ExpSumI, в котором происходит закрытие файла:

do {

FileTotai += ProcessEmployee (infile, re) ;

if (re != EXP_NO_ERROR) { infile.close () :

return;

} } while (--EmployeeCount);

В программе ExpSum2 это бремя с функции снимается:

do (

FileTotai +=ProcessEmployee(infile) ;

} while (—EraployeeCount) ;

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

Обработка СПИСКа САужаЩИХ. Рассмотрим функцию ProcessEmployee.

Код версии этой функции для программы ExpSum2 содержится в листинге 22.33.

h06361.jpg

float ProcessEmployee(ifstreams infile)

{

Employee NewEmployee;

float EmployeeTotal = O.OF;

unsigned loop;