Последняя версия DataExpress 3 beta от 11 декабря 2018 года. Скачать. Энциклопедия DX. Форум на Develop-Soft

Обработка ошибок через вызов RaiseException

Вопросы о применении того или иного класса или функции.
neitri
Мастер скриптов
Сообщения: 541
Зарегистрирован: Пн фев 13, 2017 5:42 pm

Re: Обработка ошибок через вызов RaiseException

Сообщение neitri » Вс фев 18, 2018 8:20 am

Создавая exception нужно точно понимать куда перейдет выполнение программы. Если не обрабатывать его самому, то лучше будет просто завершать процедуру самому, чем надеется что системные обработчики это сделают за вас.
Помогли Тебе. Помоги проекту.
Реквизиты помощи Вы можете найти в окне "О программе"

jurist23rus
Эксперт
Сообщения: 2484
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп

Re: Обработка ошибок через вызов RaiseException

Сообщение jurist23rus » Вс фев 18, 2018 10:49 am

Я сторонник очень активного использования системных обработчиков исключений. Сам ими пользуюсь и всем советую. Они очень облегчают программирование и упрощают код.

Другое дело что RaiseException (erNoError, '')выбивается из общего ряда, так как не прекращает выполнения скрипта, хотя блокирует вывод окна Опа, что полезно, но не очень предсказуемо в поведении, так как тебе надо продумывать дальнейшее поведение программы после его вызова, что слегка напрягает.
Destiny is a very convenient word for those who never take decisions.

Аватара пользователя
admin
Разработчик
Сообщения: 3978
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская

Re: Обработка ошибок через вызов RaiseException

Сообщение admin » Вс фев 18, 2018 11:04 am

Никак не въеду зачем Вы используете эту конструкцию RaiseException (erNoError, '')? erNoError - означает "Нет ошибок", поэтому окно об ошибке не появляется.

jurist23rus
Эксперт
Сообщения: 2484
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп

Re: Обработка ошибок через вызов RaiseException

Сообщение jurist23rus » Вс фев 18, 2018 11:18 am

Вот пример конструкции, где это может пригодится.

Код: Выделить всё

procedure Proc;
begin
   try
      //произошла ошибка
   except
      msgbox ('моё сообщение об ошибке', '');
      RaiseException (erNoError, '') //блокирую штатное Опа
      exit // прерываю выполнение процедуры, ибо предыдущая инструкция её не прерывает
   end;
end;

Destiny is a very convenient word for those who never take decisions.

jurist23rus
Эксперт
Сообщения: 2484
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп

Re: Обработка ошибок через вызов RaiseException

Сообщение jurist23rus » Вс фев 18, 2018 11:30 am

Пример, когда RaiseException (erNoError, '') доставляет неудобства.

Код: Выделить всё

Procedure Proc1;
begin
   try
      //произошла ошибка
   except
      msgbox ('моё сообщение об ошибке', '');
      RaiseException (erNoError, '') //блокирую штатное Опа
      //exit тут уже не поможет
      //дальнейшее выполнение скрипта, как правило, нецелесообразно, но он продолжит выполнятся
      //будет выполнен код в процедурах Proc2 и Proc3. Это ставит вопрос о том что было бы уместно, чтобы
      //erNoError прекращал выполнение скрипта, так как дальнейшее его выполнение просто не нужно.
   end;
end;

Procedure Proc2;
begin
   Proc1;
   //код
end;

Procedure Proc3;
begin
   Proc2;
   //код
end;
Destiny is a very convenient word for those who never take decisions.

Аватара пользователя
admin
Разработчик
Сообщения: 3978
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская

Re: Обработка ошибок через вызов RaiseException

Сообщение admin » Вс фев 18, 2018 12:35 pm

Код: Выделить всё

Procedure Proc1;
begin
   try
      //произошла ошибка
   except
      msgbox ('моё сообщение об ошибке', '');
      //RaiseException (erNoError, '') //блокирую штатное Опа
      //exit тут уже не поможет
      //дальнейшее выполнение скрипта, как правило, нецелесообразно, но он продолжит выполнятся
      //будет выполнен код в процедурах Proc2 и Proc3. Это ставит вопрос о том что было бы уместно, чтобы
      //erNoError прекращал выполнение скрипта, так как дальнейшее его выполнение просто не нужно.
   end;
end;

Разве без RaiseException (erNoError, '') появляется "Опа"? Конструкция try..except блокирует "Опа". Вообще принудительно прерывать весь скрипт неправильно, к тому же таких средств в программе нет. Правильнее будет возвращать какой-то код ошибки функцией.

jurist23rus
Эксперт
Сообщения: 2484
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп

Re: Обработка ошибок через вызов RaiseException

Сообщение jurist23rus » Вс фев 18, 2018 12:56 pm

admin писал(а):Разве без RaiseException (erNoError, '') появляется "Опа"?

Я не готов говорить за все случаи, просто не проверял, но если ошибку возвращает OleObject, то Опа появляется и заблокировать окно Опы можно только вызвав erNoError.
Destiny is a very convenient word for those who never take decisions.

Аватара пользователя
admin
Разработчик
Сообщения: 3978
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская

Re: Обработка ошибок через вызов RaiseException

Сообщение admin » Вс фев 18, 2018 1:38 pm

Так быть не должно. Можно конкретный пример?

jurist23rus
Эксперт
Сообщения: 2484
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп

Re: Обработка ошибок через вызов RaiseException

Сообщение jurist23rus » Вс фев 18, 2018 2:22 pm

admin писал(а):Так быть не должно.

Вы правы. Попытался воссоздать пример и не получилось - всё работает как надо. Конструкция try..except блокирует "Опа".

admin писал(а):Вообще принудительно прерывать весь скрипт неправильно, к тому же таких средств в программе нет. Правильнее будет возвращать какой-то код ошибки функцией.

А почему неправильно, если ситуация того требует? Если возвращать код ошибки, то это усложнит логику скрипта.
Во-первых, там где сейчас процедуры Proc1 и Proc2 их надо превращать в функции, чтобы они возвращали результат выполнения.
Во-вторых, возвращаемый результат нужно обрабатывать даже в самом просто варианте - if not Proc1 then exit - это уже обработка. Ну а если возвращать код ошибки, то это значительно сложнее. Если последовательно вызываются три и более функции, то в каждой должен быть однотипный обработчик ошибок. Как-то громоздко, а всего лишь нужно прервать выполнение скрипта.
Destiny is a very convenient word for those who never take decisions.

Аватара пользователя
admin
Разработчик
Сообщения: 3978
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская

Re: Обработка ошибок через вызов RaiseException

Сообщение admin » Вс фев 18, 2018 2:34 pm

Просто оберните начальный код, который вызывает вложенные процедуры, в try..except.


Вернуться в «Вопросы по API DataExpress.»