перехват ошибок oracle

совсем новенький
Дата: 13.11.2007 11:16:17
Добрый день.
Подскажите, пожалуста, где можно почитать про обработку исключений.
Сейчас самостоятельно пытаюсь освоить Delphi для собственных нужд, без каких-либо претензий на что-то особенное. В своей книжке не получается разобраться с исключениями.

Процедура рботает с БД Oracle. Хочу заранее объявить те или иные ошибки Oracle. Как это можно сделать? Как получить код ошибки, чтобы его прописть в EXCEPT?

По книге понял, что можно использовать EXCEPTOBJECT.СLASSNAME для определения ошибки

Поэтому писал так


try
...
exept
ShowMessage(exceptobject.ClassName);


В процессе работы приложения при генерации ошибки выдает сообщение "OleException"

Тогда в обработчике пишу


try
...
exept
on OleException do...

Ругается на то, что OleException не объявлен. В книжке что OleException это ошибка, так же как и EconvertError и пр. Или я неправильно понимаю? Как тогда указывать такое исключение?
SQLap
Дата: 13.11.2007 11:36:45
EOleException
alex0
Дата: 13.11.2007 11:45:28
    except
      on E:Exception do
        ShowMessage('код ошибки: 'IntToStr(E.HelpContext)+' текст ошибки: '+E.Message);
    end;
SQLap
Дата: 13.11.2007 11:48:20
alex0
    except
      on E:Exception do
        ShowMessage('код ошибки: 'IntToStr(E.HelpContext)+' текст ошибки: '+E.Message);
    end;


      on E:Exception do
        if (E is EOleException) then ...
совсем новенький
Дата: 13.11.2007 12:13:35
Спасибо большое! Очень помогли! :-))

(Насчет имени ошибки - я был неправ, неправильно написал.)

А можно теперь как-то обрабатывать какие-то конректные ошибки Oracle?
Т.е. после применения предложенных вариантов я получил код и текст ошибки. В моем случае это:


Код ошибки: 0 текст ошибки: ORA-00955: name is already used by an exsisting object
ORA-06512: at HUR. line 59


Или здесь уже надо анализировать текст сообщения? Т.е. использовать SUBSTR и INSTR (в смысле их аналоги в Delphiб пока не знаю как они называются) для E.Message и использовать уже полученный код реальной ошибки в обработчике?
SQLap
Дата: 13.11.2007 12:47:11
не прще будет пасти их на серверной строне?
A.K.
Дата: 13.11.2007 12:49:42
Как правило, для работы с Oracle из Delphi используют хорошо приспособленные для этого библиотеки компонентов сторонней разработки: AnyDAC, ODAC, DOA, ....
Для них ничего извлекать из E.Message не нужно, так как при возникновении ошибок БД они инициируют свои типы исключений (например, в DOA - EOracleError), у которых имеется свойство, возвращающее код ошибки (ErrorCode).
Например:
try
  ...
except
  on E:EOracleError do
  begin
    if E.ErrorCode = 942 then  // ORA-00942: Table or view does not exist
      ShowMessage('...пользовательское сообщение для ошибки ORA-00942...');
    else // Другие ошибки БД
      ShowMessage(E.Message);
  end;
  on E: Exception do // Прочие ошибки
    ShowMessage('Прочие ошибки, не связанные с БД: '+E.Message);
end;
У EOleException тоже есть свойство ErrorCode - проверьте, но я не уверен, что оно возвращает то что вам хочется.
совсем новенький
Дата: 13.11.2007 13:31:47
To A.K. - большое человеческое СПАСИБО. Теперь понятно в каком направлении надо искать :)
Похоже, именно то, что мне нужно. Т.е. теперь мне надо где-то найти соответсвующую библиотеку? Прописать ее в "USES" и уже можно пользоваться. Я правильно понимаю?

Не понял насчет "пасти их на серверной строне". Т.е. прописать обработку исключения непосредственно в SQL-коде?

Спасибо всем за участие и помощь!
A.K.
Дата: 13.11.2007 15:15:24
совсем новенький
Т.е. теперь мне надо где-то найти соответсвующую библиотеку?
Это не догма, а практический совет. Использовать сторонние компоненты прямого доступа к Oracle гораздо практичнее, чем ADO или BDE.
совсем новенький
Прописать ее в "USES" и уже можно пользоваться. Я правильно понимаю?
Не "прописать в uses", а установить выбранную библиотеку компонентов в соответствии с прилагаемой к ней инструкцией (как правило - скомпилировать и установить соответствующие пакеты, если инсталлятор этого не сделает самостоятельно).
совсем новенький
Не понял насчет "пасти их на серверной строне". Т.е. прописать обработку исключения непосредственно в SQL-коде?

Не стоит возводить этот совет в разряд строгой рекомендации - все зависит от ситуациии.
совсем новенький
Дата: 13.11.2007 16:28:58
Я понял.
Спасибо :)