Я использую Delphi Pro 6 на Windows XP с FastMM 4.92 и джедаем JVCL 3.0. Учитывая код ниже, у меня есть следующая проблема: только первый блок обработки исключений получает допустимый экземпляр E. Другое соответствие блоков правильно с классом повышаемого Исключения, но E является неприсвоенным (ноль).
Например, учитывая текущее распоряжение блоков обработки исключений, когда я повышаю E1, блок для соответствий E1 и E является экземпляром доступного объекта. Однако, если я пытаюсь повысить E2, тот блок действительно соответствует, но E является неприсвоенным (ноль). Если я перемещаю захватывающий блок E2 в вершину упорядочивания и повышаю E1, то то, когда блок E1 соответствует E, является теперь неприсвоенным. С этим новым упорядочиванием, если я повышаю E2, правильно присвоен E, когда это не было, когда блок E2 не был первым блоком в упорядочивании. Обратите внимание, что я рассмотрел это дело с базовым проектом, состоящим из просто единственной формы Delphi.
Я делаю что-то действительно глупое здесь или являюсь чем-то действительно неправильно?
Спасибо, Robert
type
E1 = class(EAbort)
end;
E2 = class(EAbort)
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
try
raise E1.Create('hello');
except
On E: E1 do
begin
OutputDebugString('E1');
end;
On E: E2 do
begin
OutputDebugString('E2');
end;
On E: Exception do
begin
OutputDebugString('E(all)');
end;
end; // try()
end;
Если я прав, то поведение, которое вы наблюдаете, наблюдается при оценке E под отладчиком (я получил похожее поведение, тестируя это в отладчике BDS 2006).
Это ошибка разрешения символов в отладчике, но, похоже, она не влияет на поведение во время выполнения.
Если поведение при отладке важно, просто переименуйте переменные обработчика исключений так, чтобы отладчику не приходилось разрешать (потенциальные) двусмысленности:
On E1: E1 do
begin
OutputDebugString('E1');
end;
On E2: E2 do
begin
OutputDebugString('E2');
end;
On Ex: Exception do
begin
OutputDebugString('E(all)');
end;