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

时间:2010-03-31 22:20:18

标签: delphi exception null 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;

1 个答案:

答案 0 :(得分:8)

如果我是对的,在调试器下评估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;
相关问题