try .... exception if ... then on e:exteption do messagebox(0,e.Message,'Ошибка',MB_OK); if ... then raise; end;
Должно быть 2 условия при выполнении одного вывод ошибки, при выполнении второго - генерация исключительной ситуации, которая будет содержать описание ошибки.
Для выбора ветки обработки исключений используется класс эксепшена, конструкция if не используется. Если вы генерируете сообщения сами - опишите наследников для каждого конкретного типа исключения.
Exception3 = class(Exception) end; ................ try // тестируем (расскоментируйте одну из строк) // raise Exception.Create('blah blah'); // raise Exception2.Create('blah blah'); // raise Exception3.Create('blah blah'); // raise Exception4.Create('blah blah'); except on E : Exception1 do MessageBox(Handle,'On Exception1','Exception',MB_OK or MB_ICONERROR); {сообщение на Exception1} on E : Exception2 do raise Exception.Create('On Exception2 with message: '+E.Message); {другое искльючение с "подробностями" на Exception2} on E : Exception3 do {игнорируем Exception3} else raise; {перевозбуждаем (reraise) все другие exception-ы и отпарвляем на обработку дальше} end;
Условия у меня используются для проверки значения переменных. Там суть в том, что есть 2 переменных, если первая тру - должны выводиться ошибки. Если вторая тру - должны генерироваться исключения. Если обе тру то сначала выводится ошибка потом исключение.
Type Except1 = Class(Exception) end; .......... try .... exception if v1 then on e:exteption do messagebox(0,e.Message,'Ошибка',MB_OK); if v2 then raise Except1.Create('message'); end;
try ... except on E : Exception do begin if v1 then MessageBox(Handle,PWideChar(WideString('Exception '+E.ClassName+' with message: '+E.Message)),'Error',MB_OK or MB_ICONERROR); if v2 then raise Exception1.Create('Rerise Exception '+E.ClassName+' with message: '+E.Message); end; end;
Я бы добавил еще третье условие: if not (v1 or v2) then raise; На случай если обе переменные False, а то исключение вообще "погасится" (без отладчика).
HowlingDragon писал(а):И будет ли этот код "ловить" ошибки oracle, или для тех ошибок нужно отдельно что то писать?
Я точно не знаю, но скорее всего будет генерится эксепшен EExternal или наследник от него. Под виндой у него есть поле ExceptionRecord типа PExceptionRecord у которого есть поле ExceptionCode
Aleksey Elin писал(а):Под виндой у него есть поле ExceptionRecord типа PExceptionRecord у которого есть поле ExceptionCode
Не вводите человека в заблуждение. В EExternal -- сведения об исключении Windows. Ошибки Oracle ничего общего с ними не имеют и идут по другой ветке наследования.
EOraError (или как там в Zeos?) должны наследоваться от EDBError и содержать свое поле ErrorCode, содержащее именно код ошибки Oracle. Интересно, он будет отрицательным или нет?
evb87ar Большое спасибо. Правильно ли я понял? Удалить только пакеты fpc, а старый Lazarus удалять не надо, достаточно только пересобрать? На оф.сайте предлагают "You need to download and install fpc, fpc-src and lazarus". А как быть с Geany?