![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка ошибки при неверном добавлении записи в БД.
Гость © (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-)