Обработка исключений

Добавил admin | Обработка исключений | Воскресенье 4 октября 2009 15:55

Конструкция «Попытка…Исключение»

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

Однако разработчик может перехватывать возникающие ошибки и обрабатывать их по своему усмотрению, например:

Попытка 
    СредняяЦена = СуммаВсего / Количество; 
Исключение
    //Возникла ошибка деления на ноль.

    //Будем считать, что количество равно 1.

    Количество = 1;

    СредняяЦена = СуммаВсего; 

КонецПопытки;

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

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

Попытка
    ТекстФайл.Записать(ПутьКФайлу);
Исключение
    Сообщить("Не удалось записать файл!");
КонецПопытки;

Внутри блока Исключение…КонецПопытки можно вызвать функцию ОписаниеОшибки, которая возвращает сообщение о возникшей ошибке в виде строки. Эту строку можно выдать в окно сообщений, записать в журнал регистрации или выполнить другие действия.

Кроме того, есть команда ВызватьИсключение, которая может применяться только внутри блока обработки исключения. Хотя программист и обработал ошибку, но он может ее пропустить (передать обработчику вышестоящего уровня), например, если она неисправима:

Попытка
        СредняяЦена = СуммаВсего / Количество;
    Исключение
        Сообщить("Эх! Надо было проверить количество на ноль!");
        Сообщить(ОписаниеОшибки());
 ЗаписьЖурналаРегистрации(ОписаниеОшибки());
        //хотя мы и обработали ошибку, но программу все равно прервем
    ВызватьИсключение;
КонецПопытки;

Обработчики исключений могут быть вложенными друг в друга. Если ошибка не обработана во внутреннем блоке Исключение…КонецПопытки, тогда она обрабатывается внешним обработчиком, а если его нет, выдается системное сообщение об ошибке.