Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.18;
Скачать: CL | DM;

Вниз

Как перехватить ошибку?   Найти похожие ветки 

 
Юлия   (2003-08-26 12:44) [0]

При попытке добавить неуникальное значение в индексированное (уникально) поле таблицы появляется ошибка. Как перехватить ее и вывести свое сообщение?


 
Zacho ©   (2003-08-26 12:48) [1]

Например, написать обработчик события OnPostError.


 
Юлия   (2003-08-26 12:56) [2]

как предотвратить появление стандартного сообщения?

procedure Form1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
application.MessageBox("Неуникальное значение","Ошибка",mb_ok);
abort;
end;

Стандартное сообщение появляется все равно.
И как определить, что ошибка произошла именно в результате вставки неуникальной записи?


 
VAleksey ©   (2003-08-26 12:59) [3]

Try
Post;
Except
On E:Exception do
begin
....
end;
end;

Это общий случай.
В твоем случае можно > Zacho © (26.08.03 12:48)
PS
А вместо Exception нужный класс исключения.


 
ZrenBy ©   (2003-08-26 12:59) [4]

Проверять перед вставкой

if(t.FindKey(...)=True)then raise ...


 
LVitaliy ©   (2003-08-26 13:00) [5]

Поставить
try ....
Post
except
Сообщение("Неуникальное значение");
end;


 
alex-ran   (2003-08-26 13:00) [6]

Попробуй так:
try
tblAccount.InsertRecord([...,...,...]);
except
on EDBEngineError do beginMessageBox("Неуникальное значение","Ошибка",mb_ok
Abort;
end;


 
Zacho ©   (2003-08-26 13:02) [7]


> Юлия (26.08.03 12:56) [2]

TDataSetErrorEvent = procedure(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction) of object;

Обрати внимание на E: EDatabaseError; и var Action: TDataAction
Подробности - в хелпе.


 
alex-ran   (2003-08-26 13:03) [8]

Вернее так, опечатался :) :
try
Table1.InsertRecord([...,...,...]);
except
on EDBEngineError do
begin
MessageBox("Неуникальное значение","Ошибка",mb_ok
Abort;
end;
end;


 
Юлия   (2003-08-26 13:56) [9]

Напишите, пожалуйста, как это должно выглядеть.


 
Юлия   (2003-08-26 14:00) [10]

(Вопрос к Zacho)


 
Zacho ©   (2003-08-26 14:04) [11]

Примерно так:
procedure Form1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if E.Message="не помню я, какое там сообщение, поставь нужное" then
begin
Action:=daAbort;
application.MessageBox("Неуникальное значение","Ошибка",mb_ok);
end else Action:=daFail;
end;


 
VAleksey ©   (2003-08-26 14:07) [12]


> Zacho © (26.08.03 14:04)

Лучше посмотреть в helpe или книге или как - нибудь получить класс исключения и проверить КЛАСС исключения.


 
Zacho ©   (2003-08-26 14:09) [13]


> VAleksey © (26.08.03 14:07) [12]

Согласен. Но у меня старая привычка парсить текст сообщения об ошибке :)


 
Юлия   (2003-08-26 14:11) [14]

Стандартное Сообщение об ошибке вылезает раньше, чем наступает событие onPostError.


 
VAleksey ©   (2003-08-26 14:14) [15]


> Юлия

Тоже естественно. Т.к. жанное сообщение генерируется BDE.
см.

> VAleksey © (26.08.03 12:59)


 
Юлия   (2003-08-26 14:20) [16]

Если написать такой код, стандартное сообщение появляется, а мое - нет. В процедуру не попадаем.


 
Zacho ©   (2003-08-26 14:23) [17]


> Юлия (26.08.03 14:11) [14]

А у меня - нет. Попробуй снять галочку "Break on Exceptions" или запустить программу не из Дельфи.


 
VAleksey ©   (2003-08-26 14:24) [18]


> Zacho © (26.08.03 14:23)

Мне тоже помнится, что исключение на нарушение первичного ключа вызывается до OnPostError.


 
Юлия   (2003-08-26 14:28) [19]

Пробовала. Не получается. Пишет: key violation


 
VAleksey ©   (2003-08-26 14:33) [20]


> Юлия

Блин, а ты вот этого типа "VAleksey ©" игнорируешь?, или явно Post нигде не вызываешь? ;-)


 
Zacho ©   (2003-08-26 14:33) [21]


> VAleksey © (26.08.03 14:24) [18]


> Юлия (26.08.03 14:28) [19]

Только что попробовал. Все работает нормально. Естественно, при запусе под отладчиком при включенной опции "Break on Exceptions" сначало выдается стандартное сообщение об ошибке и вываливается в отладчик, а потом вызывается OnPostError. При запуске программы не из Дельфи - естественно, никаких "стандартных" сообщений нет, только то, что я сам выдаю в OnPostError.
2 Юлия : приведи свой код обработчика OnPostError.


 
VAleksey ©   (2003-08-26 14:45) [22]

В обработчике напиши.
Action := daAbort;


 
Юлия   (2003-08-26 14:52) [23]

VAleksey:
Я действительно явно не вызваю post... У меня значение выбирается из lookup поля... В момент выбора вылезает ошибка. в этом дело? А где же его ловить тогда?

Zacho:
Код обработчика:
application.MessageBox("Неуникальное значение","Ошибка",mb_ok);
Action:=daAbort;

У меня не работает.
(с текстом сообщения пока не разобралась)


 
Zacho ©   (2003-08-26 14:54) [24]


> Юлия (26.08.03 14:52) [23]

Ну не знаю. У меня - работает.


 
AlexWeb   (2003-08-26 16:50) [25]

Вам же сказали, попробовать запустить программу не из Дельфи!!!
При ошибке сообщение будет показываться только Ваше.

procedure TForm1.Query1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if E.HelpContext = 0 then
begin
Action:= daAbort;
ShowMessage ("Неуникальное значение"));
end;
end;



Страницы: 1 вся ветка

Текущий архив: 2003.09.18;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.026 c
14-58894
Е-Моё имя
2003-09-01 09:37
2003.09.18
Лицензионное соглашение


1-58762
Ghost
2003-09-06 13:37
2003.09.18
Не могу понять в чем ошибка :(


1-58746
SergeY_X
2003-09-07 01:48
2003.09.18
CAB - SFX


1-58732
race1
2003-09-07 14:31
2003.09.18
tscrollbox


14-58916
TButton
2003-08-31 19:43
2003.09.18
WinXP - вирус???