Exception'ы не перепередаются

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

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

Ответить
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Exception'ы не перепередаются

Сообщение hinst »

Собственно, хотел сделать, чтобы из except-блока у меня исключение передавалось дальше, вызывающим методам. Но почему-то не попёрло. Написал отдельно тестовую программку. Что я делаю не так?

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

program project1;

{$mode objfpc}{$H+}

uses
  Classes, SysUtils;

procedure a;
begin
  raise Exception.Create('FFFUUU');
end;

procedure b;
begin
  try
    a;
  except
    on e: Exception do
    begin
      WriteLN('A excepted');
      raise e;
    end;
  end;
end;

begin
  try
    b;
  except
    on e: Exception do
      WriteLN('B excepted');
  end;
  WriteLN('bye');
end.


Вылезает:

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

A excepted
An unhandled exception occurred at $004015BE :
Exception object An unhandled exception occurred at $00402285 :
EAccessViolation : Access violation
  $00402285
  $00407221
  $00407AF4
  $00407D69

Хотя, вместо "An unhandled exception" я ожидал увидеть "B excepted"
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

О, еще один баг!
Для передачи исключения "дальше" обычно применяют raise без аргументов. Но и приведенный пример уж точно не должен обращаться мимо памяти...

p.s: В Дельфи 7 этот пример тоже падает, только немного позже (во время финализации модулей).
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

Sergei I. Gorelkin
спасибо, сделал просто raise; теперь работает
Ответить