Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Внизtry ... except Найти похожие ветки
← →
Ольга (2003-05-27 13:54) [0]Здравствуйте!
У меня творится какая-то мистика! Не работает следующая ловушка ошибок:
try
Form1.OracleScript.Execute ;
InsertedCount := InsertedCount + 1 ;
except
on E : Exception do showmessage ("Error") ;
end ;
При выполнении Form1.OracleScript.Execute ; должна возникать ошибка и выдаваться сообщение. Этот оператор добавляет строки в БД Oracle (делает INSERT). На самом деле Оракл ругается, и запись в базу не попадает, а Дельфи во время выполнения никаких сообщений не выдает, как-будто все прошло успешно. Если включить галочку в Debuger Options Stop on Delphi Exceptions, то Дельфи ругается (выдает Оракловское сообщение об ошибке при вставке), а если отключить ее, ошибок как бы не происходит. Причем, другие ловушки, как до, так и после данного кода работают нормально.
В чем тут дело?
← →
Skier (2003-05-27 13:57) [1]>Ольга (27.05.03 13:54)
А запускать приложение не из-под Delphi не пыталась ?
← →
Ольга (2003-05-27 14:02) [2]Запускала. Тоже не ругается, но и записи не добавляет.
← →
Zelius (2003-05-27 14:04) [3]А оракловые исключения от Exception наследуются? Может они от EAbort ведут свои корни? :)
← →
Skier (2003-05-27 14:06) [4]>Ольга (27.05.03 14:02)
1) Скорее всего OracleScript.Execute не генерит никакого
исключения
2) И, видимо, тебе нужно просто использовать результат
ф-ции Execute (это ведь наверняка функция...), т.е.
if Form1.OracleScript.Execute then begin
Inc(InsertedCount);
end //if
else begin
showmessage ("Error") ;
end; //else
← →
Ольга (2003-05-27 14:07) [5]Наследуются, наверное. Потому что в других местах Оракловые ошибки таким же образом отлавливаются.
← →
Ольга (2003-05-27 14:12) [6]Form1.OracleScript.Execute - это процедура
Но OracleScript я использую первый раз, не знаю его особенностей. Может, действительно, в нем дело?
← →
Skier (2003-05-27 14:13) [7]>Ольга (27.05.03 14:12)
Странно...
1)Процедура без параметров ?
2) Исходники OracleScript.Execute есть ?
← →
Skier (2003-05-27 14:17) [8]>Ольга (27.05.03 14:12)
И ещё :
Посмотри может быть при возникновении ошибок в скрипте, в классе
OracleScript устаналиваются какие-то флаги...Вполне может быть...
← →
Ольга (2003-05-27 14:19) [9]Я почитала, и, похоже, действительно, он особенный:
Error handling
Individual SQL statements can lead to an error. You can control if such an error should stop further execution of the script through the ExitOnError property.
An SQL error will also lead to an OnError event, which you can specifically handle. After execution you can also check the ErrorCode and ErrorMessage property of each command.
Кажется, на try ... except он не ловится, ошибки в его событии onError отлавливаются. Проверила - выдается мессадж.
← →
Skier (2003-05-27 14:21) [10]>Ольга (27.05.03 14:19)
> Кажется, на try ... except он не ловится, ошибки в его событии
> onError отлавливаются. Проверила - выдается мессадж.
onError - это и есть решение проблемы. Поставь на это
событие свой обработчик и усё...:)
← →
Digitman (2003-05-27 14:22) [11]
> Ольга
Не исключено, что метод Execute - асинхронный.
И, возможно, асинхронный по-умолчанию.
Я не в курсе, но наверняка у объекта OracleScript есть некие события наподобие OnError и/или OnSuccess/OnComplete. Там (в обработчиках этих событий), вероятно, и следует фиксировать факт успешного/неуспешного выполнения скрипта.
И, возможно, существует некое св-во объекта OracleScript, позволяющее выполнить запрос в синхронном режиме, при котором исключения как раз и можно перехватывать желаемым тобой способом.
← →
Ольга (2003-05-27 14:23) [12]Уже поставила. Спасибо!
Просто странно, почему так сделано?
← →
Skier (2003-05-27 14:25) [13]>Ольга (27.05.03 14:23)
Наверняка в этом классе (OracleScript) много всяких
настроек (Oracle ведь штука сложная :) ). Почитай про этот
класс по-внимательней..."дверь и откроется" :)
← →
Digitman (2003-05-27 14:38) [14]
> Ольга
нормально сделано) ... по-умному)
представь себе, что исполнение скрипта сервером займет значительное время (десяток минут)
при этом кодовый поток, в котором в синхронном режиме был вызван метод Execute, будет блокирован до тех пор, пока запрос не выполнится полностью либо не возникнет исключение
а ведь все эти 10 минут, что сервер "пыхтит" над исполнением запроса, кодовый поток клиентского приложения вполне мог бы заняться другими "полезными" вещами !) а не стоять на месте и покорно ждать "милости" от сервера))
← →
Ольга (2003-05-27 14:39) [15]Все ясно!
Еще раз всем спасибо! :)
← →
Ольга (2003-05-27 15:10) [16]Действительно, OracleScript.Execute выполняется в отдельном потоке. И это очень замечательно! :)
← →
Digitman (2003-05-27 15:52) [17]
> Ольга
если OracleScript.Execute - асинхронный, то вряде случаев совершенно индифферентно, в каком код.потоке он выполняется. Важно, что не блокирует он (метод) код.поток
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c