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

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

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

Ответить
HowlingDragon
новенький
Сообщения: 16
Зарегистрирован: 13.09.2012 17:46:22

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

Сообщение HowlingDragon »

Здравствуете. Хочу узнать, возможна ли повторная обработка исключений:

Код: Выделить всё

try
....
exception
if ... then on e:exteption do messagebox(0,e.Message,'Ошибка',MB_OK);
if ... then raise;
end;

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

Сообщение Aleksey Elin »

Для выбора ветки обработки исключений используется класс эксепшена, конструкция 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
HowlingDragon
новенький
Сообщения: 16
Зарегистрирован: 13.09.2012 17:46:22

Сообщение HowlingDragon »

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

Получается должно быть что то вроде этого?
Aleksey Elin
новенький
Сообщения: 15
Зарегистрирован: 13.09.2012 22:34:34

Сообщение Aleksey Elin »

Тогда так:

Код: Выделить всё

  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
новенький
Сообщения: 16
Зарегистрирован: 13.09.2012 17:46:22

Сообщение HowlingDragon »

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

Добавлено спустя 18 минут 7 секунд:
И будет ли этот код "ловить" ошибки oracle, или для тех ошибок нужно отдельно что то писать?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

HowlingDragon если их формирует Zeos, то будет.
Aleksey Elin
новенький
Сообщения: 15
Зарегистрирован: 13.09.2012 22:34:34

Сообщение Aleksey Elin »

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;

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

Сообщение HowlingDragon »

А что на счёт кода ошибки?
Аватара пользователя
Vapaamies
постоялец
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vapaamies »

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

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

EOraError (или как там в Zeos?) должны наследоваться от EDBError и содержать свое поле ErrorCode, содержащее именно код ошибки Oracle. Интересно, он будет отрицательным или нет?
HowlingDragon
новенький
Сообщения: 16
Зарегистрирован: 13.09.2012 17:46:22

Сообщение HowlingDragon »

Спасибо, кажется разобрался.
tysonlee
незнакомец
Сообщения: 1
Зарегистрирован: 24.10.2012 14:13:46

Сообщение tysonlee »

evb87ar Большое спасибо. Правильно ли я понял? Удалить только пакеты fpc, а старый Lazarus удалять не надо, достаточно только пересобрать? На оф.сайте предлагают "You need to download and install fpc, fpc-src and lazarus". А как быть с Geany?
Ответить