Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка ошибки при неверном добавлении записи в БД.


Гость ©   (2009-04-21 10:21:00) 

Добрый день.
Ситуация след-я.
При добавлении новой записи в табличку, если не все поля заполнены вылезает ошибка примерно такая:

Project Project1.exe raised exception class EFIBInterBaseError with message 'DMForm.ClassDSet.InsertQuery:
The insert failed because a column definition includes validation constraints.Validation error for column ID_MODEL, value "*** null ***".
'.
Хочется обработать ее и выдать собственное сообщение пользователю.
Кидаю на форму ErrorHandler1. Пишу обработчик:
procedure TDMForm.ErrorHandler1FIBErrorEvent(Sender: TObject;
 ErrorValue: EFIBError; KindIBError: TKindIBError; var DoRaise: Boolean);
begin
 DoRaise := True;
 if (Sender is TFIBQuery) and
    (ErrorHandler1.LastError = keOther) // Она почему то именно этого типа.
 then
 begin
   MessageDlg('Все поля новой записи должны быть заполнены!!', mtError,[mbOK], 0);
   DoRaise := False;
 end;
end;

Так вот, если ошибка возникает в следствии попытки пользователя перейти на с новой недозаполненной записи на другую, то сообщение то я получаю свое, но вот переход на другую запись осуществляется и получается в табличке на форме неверная строка!!
Если же [b]DoRaise[/b] ставить в true, то остается текущей неверная строчка, что и требуется, но при этом вслед за моим сообщением вылезает ошибка с сервера.
(FB, FIB, Delphi 2007)


Гость   (2009-04-21 15:19:00) [1]

Sergey13, спасибо. Аборт помог ))
Для лога использую отдельную функцию:

procedure AddToLog(s:string);
var
fn:string;
F:TextFile;
begin
 Fn:=ExtractFilePath(ParamStr(0))+'ARM_log.txt';
 assignFile(f,fn);
 if FileExists(fn) then Append(f) else Rewrite(f);
 Write(f,DateTimeToStr(Now));
 Writeln(f,'> '+ s);
 Flush(f);
 Closefile(f);
end;


Anatoly Podgoretsky   (2009-04-21 15:15:00) [2]

> clickmaker  (21.04.2009 14:56:08)  [8]

Можно и так, а можно и в сообщение. Вариантов то много. Важно не скрывать, а то концов не найти.


clickmaker   (2009-04-21 14:56:00) [3]

> Так есть же другой метод, когда текста два, свой и оригинальный

это и имелось в виду под ведением лога. Разумеется, юзеру надо как-то сказать об ошибке


Anatoly Podgoretsky   (2009-04-21 13:24:00) [4]

> clickmaker  (21.04.2009 13:21:06)  [6]

Так есть же другой метод, когда текста два, свой и оригинальный. И нашим и вашим.


clickmaker   (2009-04-21 13:21:00) [5]

> прятать оригинальную строку с ошибкой ни в коем случае нельзя!

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


Anatoly Podgoretsky   (2009-04-21 13:19:00) [6]

Стрелять из рогатки.


sniknik   (2009-04-21 13:12:00) [7]

прятать оригинальную строку с ошибкой ни в коем случае нельзя! самые большие проблемы с поддержкой не изза того, что чего-то не работает, а из-за того, что ошибка не выдается или "переводится" (а то еще одной фразой целый класс ошибок. русификаторы блин).


Sergey13   (2009-04-21 12:44:00) [8]

> [2] Гость   (21.04.09 11:32)

Abort


Гость   (2009-04-21 11:32:00) [9]

Sergey13, согласен полностью.
Подскажи, pls, как мне обработать эту ошибку перед добавлением записи.
Я пробовал сделать в методе BeforePost. Но не могу сообразить как отменить этот самый Post и вернуть пользователя на неверную строку, а не просто отменить с удалением этой строки, что делает DataSet.Cancel.


Sergey13   (2009-04-21 10:30:00) [10]

Я предпочитаю не допускать до сервера не проверенные (хотя бы прмитивненько) данные.
Во первых можно проверить данные перед POST-ом. Во вторых можно (и очень желательно) сделать ввод сложных и/или объемных данных на отдельной форме и проверять по кнопке "Сохранить".
А отлов исключений сервера - это последний рубеж обороны, который никогда не должен срабатывать. 8-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо