我在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;
答案 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;