Плох тот Error, который не мечтает стать General'ом.
procedure TFDMUtils.GeneralError(DataSet: TDataSet; E: EDatabaseError; var
Action: TDataAction);
var
i: Word;
ExtInfo: string;
begin
ExtInfo := '';
if (E is EDBEngineError) thenbeginif (EDBEngineError(E).Errors[0].NativeError = 0) thenbegin// Local Errorif EDBEngineError(E).Errors[0].Errorcode = 9732 then
ExtInfo := DataSet.FieldByName(trim(copy(E.Message, 29,
20))).DisplayLabel;
.......................................
endelsebegin// Remote SQL Server error
ExtInfo := ExtractFieldLabels(DataSet, E.Message);
case EDBEngineError(E).Errors[0].NativeError of
233, 515:
Alert('Ошибка', 'Hе все поля заполнены ! ' + ExtInfo);
547:
if (StrPos(PChar(E.Message), PChar('DELETE')) <> nil) then
Alert('Ошибка пpи удалении',
'Имеются подчиненные записи, удаление (изменение) невозможно! ' +
ExtInfo)
elseif (StrPos(PChar(E.Message), PChar('INSERT')) <> nil) then
Alert('Ошибка пpи вставке', 'Отсутствует запись в МАСТЕР-таблице! '
+ ExtInfo)
elseif (StrPos(PChar(E.Message), PChar('UPDATE')) <> nil) then
Alert('Ошибка пpи обновлении',
'Отсутствует запись в МАСТЕР-таблице! ' + ExtInfo);
2601:
Alert('Ошибка', 'Такая запись уже есть!');
else
Alert('Ошибка', 'Hеизвестная ошибка, код - ' +
inttostr(EDBEngineError(E).Errors[0].NativeError) + ExtInfo);
end;
end;
end;
end;
Этот код был заточен под MSSQL, но не нужно пытаться его использовать, а лучше
по этому пpимеpу написать свою процедуру.
Бесподобный RAISEERROR!
Чтобы поймать и обработать RAISEERROR в Delphi, вам нужно использовать блок Try... Except. Вот пример, как можно модифицировать ваш код:
procedureTFDMUtils.GeneralError(DataSet:TDataSet;E:EDatabaseError);vari:Word;ExtInfo:string;begintry// Ваш оригинальный код здесьexceptonE:EDBEngineErrordobeginif(EisEDBEngineError)thenbegin// Обработайте ошибку здесьend;end;end;end;
В этом примере мы используем блок Try... Except, чтобы поймать любые исключения, которые могут возникнуть при выполнении вашего кода. Мы конкретно ловим исключение EDBEngineError, которое является типом исключения, возбужденным RAISEERROR.
Внутри блока except вы можете обработать ошибку по мере необходимости. Вы можете получить оригинальное сообщение об ошибке и другие детали с помощью переменной E.
Обратите внимание, что вам не нужно использовать отдельный процедуру для обработки ошибок; вы можете поместить код обработки ошибок непосредственно внутрь блока Try... Except.
Также помните, что RAISEERROR обычно используется для возбуждения пользовательских ошибок в базе данных. Если вы используете Delphi с другой системой базы данных (например, Oracle), вам может потребоваться использовать другой подход для обработки ошибок.
В статье описывается методика ловли и обработки ошибок RAISEERROR в Delphi с использованием примера кода на языке Pascal.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.