Форум: "Начинающим";
Текущий архив: 2009.06.07;
Скачать: [xml.tar.bz2];
ВнизОбработка ошибки при неверном добавлении записи в БД. Найти похожие ветки
← →
Гость (2009-04-21 10:21) [0]Добрый день.
Ситуация след-я.
При добавлении новой записи в табличку, если не все поля заполнены вылезает ошибка примерно такая:
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)
← →
Sergey13 © (2009-04-21 10:30) [1]Я предпочитаю не допускать до сервера не проверенные (хотя бы прмитивненько) данные.
Во первых можно проверить данные перед POST-ом. Во вторых можно (и очень желательно) сделать ввод сложных и/или объемных данных на отдельной форме и проверять по кнопке "Сохранить".
А отлов исключений сервера - это последний рубеж обороны, который никогда не должен срабатывать. 8-)
← →
Гость (2009-04-21 11:32) [2]Sergey13, согласен полностью.
Подскажи, pls, как мне обработать эту ошибку перед добавлением записи.
Я пробовал сделать в методе BeforePost. Но не могу сообразить как отменить этот самый Post и вернуть пользователя на неверную строку, а не просто отменить с удалением этой строки, что делает DataSet.Cancel.
← →
Sergey13 © (2009-04-21 12:44) [3]> [2] Гость (21.04.09 11:32)
Abort
← →
sniknik © (2009-04-21 13:12) [4]прятать оригинальную строку с ошибкой ни в коем случае нельзя! самые большие проблемы с поддержкой не изза того, что чего-то не работает, а из-за того, что ошибка не выдается или "переводится" (а то еще одной фразой целый класс ошибок. русификаторы блин).
← →
Anatoly Podgoretsky © (2009-04-21 13:19) [5]Стрелять из рогатки.
← →
clickmaker © (2009-04-21 13:21) [6]> прятать оригинальную строку с ошибкой ни в коем случае нельзя!
не очень продвинутые пользователи пугаются таких строк ) уж не говоря о том, что не все в состоянии будут, например, по телефону произнести внятно текст экцепшена. который в первом посте.
можно вести лог, в случае сбоя просить выслать его техподдержке
← →
Anatoly Podgoretsky © (2009-04-21 13:24) [7]> clickmaker (21.04.2009 13:21:06) [6]
Так есть же другой метод, когда текста два, свой и оригинальный. И нашим и вашим.
← →
clickmaker © (2009-04-21 14:56) [8]> Так есть же другой метод, когда текста два, свой и оригинальный
это и имелось в виду под ведением лога. Разумеется, юзеру надо как-то сказать об ошибке
← →
Anatoly Podgoretsky © (2009-04-21 15:15) [9]> clickmaker (21.04.2009 14:56:08) [8]
Можно и так, а можно и в сообщение. Вариантов то много. Важно не скрывать, а то концов не найти.
← →
Гость (2009-04-21 15:19) [10]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;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.06.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c