cout « (double)clock()/CLOCKS_PER SEC « “start loop\n”; } } } // Эта подпрограмма обрабатывает исключение SIGJNT void cntrl c handler(int sig) { chare; // Было обнаружено прерывание и пользователя спрашивают, должна ли программа // продолжаться cout« “ INTERRUPT” « “ type у to continue cin » c; i f ( c = ‘y’) signal(SlGINT,cntrl_c handler); // По этому запросу продолжения выполнения // повторно устанавливается пршрамма реакции на особую ситуацию. Без повторной // установки обработчика система будет возвращаться к обрабогке прерывания по умолчанию, else exit(O); // Чтобы завершить выполнение } Применим эту методику к обработке исключений для типа vect. Начнем заменять подтверждения условиями, которые устанавливают сигналы, определяемые пользователем, const int SIGHEAP=SIGUSR 1; const int SIGSIZE = SIGUSR2; vect::vect(int n) { if(n<=0) { raise(SIGSIZE); cout« “ Enter vect size n: “; cin » n; } p= new int[n]; if(p=NULL) { raise(SIGHEAP); p=new int[nj; } } Теперь можно определять обработчики, которые могут обеспечивать соответствующее действие. Например, void vect_size_handler(int sig) { chare; cout« “SIZE ERROR, Enter у to continue with default:”; cin » c; i f ( c = ‘y’) { signal(SIGSIZE,vect size handler); } else exit(O); } void vect heap handler(int sig) {// Возможные действия:
RkJQdWJsaXNoZXIy MTExODQxMg==