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

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

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

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

Сообщение neitri » Вс фев 18, 2018 6:51 pm

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

Не правильно хотя бы тем, что такое поведение место потенциальной утечки памяти.
Например создали TOpenDialog а файл который указали нам не понравился, скрипт завершился а объект никто не уничтожил и память не освободил.
Помогли Тебе. Помоги проекту.
Реквизиты помощи Вы можете найти в окне "О программе"

akelot
Заглянувший
Сообщения: 5
Зарегистрирован: Пт янв 12, 2018 9:38 pm

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

Сообщение akelot » Вт фев 27, 2018 4:26 pm

С паскалем триста лет не работал, но не пробовали финализировать?
try
//ошибка в скрипте
except
// обработать ошибку, записать информацию о ней в переменную
finaly
// совершить вывод информации об ошибке, удалить объекты скрипта и т.п.

neitri
Мастер скриптов
Сообщения: 537
Зарегистрирован: Пн фев 13, 2017 5:42 pm

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

Сообщение neitri » Вт фев 27, 2018 7:09 pm

На сколько я помню, после секции exception в секцию finaly не попадаешь, что собственно логично.

Нужно просто делать по порядку

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

try
a:=Tobject.create;
b:=Tobject.create;
RaiseException...
c:=Tobject.create;
d:=Tobject.create;
except
///*****
a.free;
b.free;
c.free;
d.free;
end;

Будем пытаться освободить не занятое :)
Универсального решения пока не вижу.
Помогли Тебе. Помоги проекту.
Реквизиты помощи Вы можете найти в окне "О программе"

akelot
Заглянувший
Сообщения: 5
Зарегистрирован: Пт янв 12, 2018 9:38 pm

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

Сообщение akelot » Вт фев 27, 2018 7:44 pm

neitri писал(а):На сколько я помню, после секции exception в секцию finaly не попадаешь, что собственно логично.

Неправильно вы помните. finaly выполняется при любом исходе. Поэтому в exception следует только обрабатывать ошибку и занести в переменные информацию о ней, а в finaly проверить значения этих переменных, если все в порядке, просто завершить исполнение, если исключение было, то к примеру - выгрузить объекты из памяти, и уведомить пользователя об ошибке.
===
P.S. Я все же могу быть не прав, просто с паскалем давно не дружу, но такой конструкцией пользуюсь на c# (только там чуть иначе выглядит, но суть одна - try {} catch{} finaly{})

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

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

Сообщение jurist23rus » Вт фев 27, 2018 8:45 pm

neitri писал(а):Будем пытаться освободить не занятое :)

Я когда ленюсь или пишу скрипт на скорую руку, то часто в секции finally обрабатываю объекты без проверки по принципу

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

a.free;
b.free;
c.free;

и очень часто попадаю на исключение, так как пытаюсь уничтожить не существующий объект. Каждый раз зарекаюсь проверять существование объекта перед уничтожением и каждый раз ленюсь. И нередко в голове после очередного исключения веду виртуальный диалог с разработчиками ObjectPascal.
Я: Что же вы лентяи, не могли деструктор free написать так, чтобы он сам проверку делал существует ли объект?
Разработчики мне: Иди к чёрту, сам проверяй.
Так и живём :) :) :)
Destiny is a very convenient word for those who never take decisions.

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

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

Сообщение admin » Вт фев 27, 2018 9:15 pm

К сожалению, FreeAndNil не работает из-за ограничений движка. Но хотя бы можно сделать процедуру, которая будет проверять на nil и вызывать Free.

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

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

Сообщение jurist23rus » Сб мар 10, 2018 5:18 pm

Живёт в Lazarus в модуле LCLProc такая процедура.

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

procedure FreeThenNil(var obj);
begin
  if Pointer(obj) <> nil then
  begin
    TObject(obj).Free;
    Pointer(obj) := nil;
  end;
end;


Добавите в движок?

А вот Дельфийская FreeAndNil. Сначала присваивает nil переменной, а потом уничтожает объект.

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

 procedure FreeAndNil(var obj);
 var
   temp: tobject;
 begin
   temp:=tobject(obj);
   pointer(obj):=nil;
   temp.free;
 end;   
Destiny is a very convenient word for those who never take decisions.

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

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

Сообщение admin » Сб мар 10, 2018 7:32 pm

Была FreeAndNil, но Pascal Script требует точного соответствия типа параметра, передаваемого по ссылке (var param: type). А т. к. в FreeAndNil параметр типа TObject, то движок выдает ошибку компиляции: несоответствие типа. Поэтому в последней сборке я убрал эту функцию и добавил FreeObj - почти то же самое, только не обнуляет ссылку.


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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость