Delphi异常处理带有多个异常处理块的问题

Rob*_*ler 7 delphi null exception try-catch except

我在Windows XP上使用Delphi Pro 6和FastMM 4.92以及JEDI JVCL 3.0.鉴于下面的代码,我遇到了以下问题:只有第一个异常处理块获得E的有效实例.其他块与正在引发的异常类正确匹配,但E未分配(nil).

例如,给定当我引发E1的异常处理块的当前顺序时,E1匹配的块和E是有效的对象实例.但是,如果我尝试引发E2,则该块匹配,但E未分配(nil).如果我将E2捕获块移动到排序的顶部并引发E1,那么当E1块匹配E时,现在是未分配的.如果我提出E2,这个新的排序,当E2块不是排序中的第一个块时,E被正确分配.注意我尝试了这个案例,只有一个Delphi表单.

我在这里做些傻事还是真的错了?

谢谢,罗伯特

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;
Run Code Online (Sandbox Code Playgroud)

Del*_*ics 9

如果我是对的,那么在调试器下评估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;
Run Code Online (Sandbox Code Playgroud)