8

我在带有 FastMM 4.92 和 JEDI JVCL 3.0 的 Windows XP 上使用 Delphi Pro 6。鉴于下面的代码,我遇到了以下问题:只有第一个异常处理块获得了 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;
4

1 回答 1

11

如果我是对的,那么在调试器下评估 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;
于 2010-03-31T23:35:59.527 回答