gpt4 book ai didi

Delphi 多个异常处理 block 的异常处理问题

转载 作者:行者123 更新时间:2023-12-03 14:52:21 24 4
gpt4 key购买 nike

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

例如,当我引发 E1 时,给定异常处理 block 的当前顺序,E1 的 block 匹配并且 E 是有效的对象实例。但是,如果我尝试提出 E2,该 block 确实匹配,但 E 未分配(nil)。如果我将 E2 捕获 block 移动到排序的顶部并引发 E1,那么当 E1 block 匹配 E 时,现在未分配。通过这个新的排序,如果我提出 E2,则当 E2 block 不是排序中的第一个 block 时,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;

最佳答案

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

关于Delphi 多个异常处理 block 的异常处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2556883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com