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)
如果我是对的,那么在调试器下评估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)