Обработка исключений

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Обработка исключений

Сообщение HowlingDragon » 11.10.2012 17:17:37

Здравствуете. Хочу узнать, возможна ли повторная обработка исключений:
Код: Выделить всё
try
....
exception
if ... then on e:exteption do messagebox(0,e.Message,'Ошибка',MB_OK);
if ... then raise;
end;

Должно быть 2 условия при выполнении одного вывод ошибки, при выполнении второго - генерация исключительной ситуации, которая будет содержать описание ошибки.
HowlingDragon
новенький
 
Сообщения: 16
Зарегистрирован: 13.09.2012 17:46:22

Re: Обработка исключений

Сообщение Aleksey Elin » 16.10.2012 11:41:31

Для выбора ветки обработки исключений используется класс эксепшена, конструкция if не используется.
Если вы генерируете сообщения сами - опишите наследников для каждого конкретного типа исключения.

Код: Выделить всё
type
  Exception1 = class(Exception)
  end;

  Exception2 = class(Exception)
  end;

  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;
Create('On Exception2 with message
Aleksey Elin
новенький
 
Сообщения: 15
Зарегистрирован: 13.09.2012 22:34:34

Re: Обработка исключений

Сообщение HowlingDragon » 16.10.2012 15:02:47

Условия у меня используются для проверки значения переменных. Там суть в том, что есть 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;

Получается должно быть что то вроде этого?
HowlingDragon
новенький
 
Сообщения: 16
Зарегистрирован: 13.09.2012 17:46:22

Re: Обработка исключений

Сообщение Aleksey Elin » 16.10.2012 17:13:04

Тогда так:

Код: Выделить всё
  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, а то исключение вообще "погасится" (без отладчика).
Aleksey Elin
новенький
 
Сообщения: 15
Зарегистрирован: 13.09.2012 22:34:34

Re: Обработка исключений

Сообщение HowlingDragon » 16.10.2012 17:46:31

Спасибо большое =), можно ли получить ещё как то код ошибки через класс Exception?

Добавлено спустя 18 минут 7 секунд:
И будет ли этот код "ловить" ошибки oracle, или для тех ошибок нужно отдельно что то писать?
HowlingDragon
новенький
 
Сообщения: 16
Зарегистрирован: 13.09.2012 17:46:22

Re: Обработка исключений

Сообщение Mr.Smart » 16.10.2012 19:37:15

HowlingDragon если их формирует Zeos, то будет.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Обработка исключений

Сообщение Aleksey Elin » 16.10.2012 19:50:41

HowlingDragon писал(а):И будет ли этот код "ловить" ошибки oracle, или для тех ошибок нужно отдельно что то писать?

Я точно не знаю, но скорее всего будет генерится эксепшен EExternal или наследник от него.
Под виндой у него есть поле ExceptionRecord типа PExceptionRecord у которого есть поле ExceptionCode

Код: Выделить всё
    EXCEPTION_RECORD = record
          ExceptionCode : DWORD;
          ExceptionFlags : DWORD;
          ExceptionRecord : ^_EXCEPTION_RECORD;
          ExceptionAddress : PVOID;
          NumberParameters : DWORD;
          ExceptionInformation : array[0..(EXCEPTION_MAXIMUM_PARAMETERS)-1] of ULONG_PTR;
       end;

Попробуйте покопать в эту сторону... (я бы сначал посмотрел класс эксепшена).
Aleksey Elin
новенький
 
Сообщения: 15
Зарегистрирован: 13.09.2012 22:34:34

Re: Обработка исключений

Сообщение HowlingDragon » 16.10.2012 20:24:35

А что на счёт кода ошибки?
HowlingDragon
новенький
 
Сообщения: 16
Зарегистрирован: 13.09.2012 17:46:22

Re: Обработка исключений

Сообщение Vapaamies » 17.10.2012 02:46:41

Aleksey Elin писал(а):Под виндой у него есть поле ExceptionRecord типа PExceptionRecord у которого есть поле ExceptionCode

Не вводите человека в заблуждение. В EExternal -- сведения об исключении Windows. Ошибки Oracle ничего общего с ними не имеют и идут по другой ветке наследования.

EOraError (или как там в Zeos?) должны наследоваться от EDBError и содержать свое поле ErrorCode, содержащее именно код ошибки Oracle. Интересно, он будет отрицательным или нет?
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Обработка исключений

Сообщение HowlingDragon » 19.10.2012 16:48:18

Спасибо, кажется разобрался.
HowlingDragon
новенький
 
Сообщения: 16
Зарегистрирован: 13.09.2012 17:46:22

Re: Обработка исключений

Сообщение tysonlee » 24.10.2012 14:17:52

evb87ar Большое спасибо. Правильно ли я понял? Удалить только пакеты fpc, а старый Lazarus удалять не надо, достаточно только пересобрать? На оф.сайте предлагают "You need to download and install fpc, fpc-src and lazarus". А как быть с Geany?
tysonlee
незнакомец
 
Сообщения: 1
Зарегистрирован: 24.10.2012 14:13:46


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru
cron