1 (edited by Serhij 2014-11-18 18:23:33)

Topic: Назначение действий при ошибках

Как можно назначить выполнение определённых действий при ошибках, возникающих во время работы программы?
Например, если вход/выход пользователей записывается в базу, то при возникновении ошибки записи в БД (I/O error) программа не завершает работу.
Как можно предоставить пользователю выбор: вернуться в программу и позже повторить выход или выйти из программы без записи действия в БД?

код кнопки выхода

procedure frmMain_btnExit_OnClick (Sender: string; var Cancel: boolean);
begin
   if MessageDlg('Ви дійсно бажаєте вийти з програми?',mtConfirmation,mbYes+mbNo,0)<>mrNo then
   frmMain.Close;
end;

код записи в лог

procedure frmMain_OnClose (Sender: string; Action: string);
   var
   sCurrentUser: string;
   sCurrentDate: string;
begin
   sCurrentUser := '"' + sUser + '"';
   sCurrentDate := '"' + FormatDateTime('yyyy-MM-DD hh:mm:ss.000', now) + '"';

   SQLExecute ('INSERT INTO inoutlog (user, action, date) VALUES ('+ sCurrentUser +',"вихід",'+ sCurrentDate +');');
end;

Re: Назначение действий при ошибках

А можно подробней о возникновении ошибки I/O error, что стало ее причиной?

Dmitry.

Re: Назначение действий при ошибках

Причиной, думаю, было то, что подключение к базе идёт через расшареную сетевую папку и на некоторое время осуществлялось переключение сетей со сменой IP. Хотя в переиод переключения программой не пользовался. Ошибка возникла после возврата на основные настройки сетевой карты, при выборе записей в гриде, и не давала завершить программу.

Re: Назначение действий при ошибках

Думаю можно вставить проверку на доступность файла базы данных, и если все ок, то выполнять SQL запрос

if FileExists('здесь указываем полный сетевой путь файла базы данных sqlite.db') then
   SQLExecute ('INSERT INTO inoutlog (user, action, date) VALUES ('+ sCurrentUser +',"вихід",'+ sCurrentDate +');');
Dmitry.

Re: Назначение действий при ошибках

Спасибо за совет, попробую.