Проблема Обработки исключений Delphi с несколькими блоками Обработки исключений

Я использую 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;
7
задан mjv 31 March 2010 в 22:25
поделиться

1 ответ

Если я прав, то поведение, которое вы наблюдаете, наблюдается при оценке 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;
9
ответ дан 7 December 2019 в 03:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: