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

标签 delphi exception null try-catch except

我在 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/

相关文章:

c# - 需要处理 NULL 异常

android - 更新时列出崩溃的应用程序

mysql 日期列为空值的 PHP 空字符串错误

delphi - 使用 DCrypt 在 Delphi (10 Seattle) 中使用 AES 加密字符串,使用 PHP/OpenSSL 解密

delphi - Delphi 对象上的 Destroy 方法和 Finalize 方法有什么区别?

Python assertRaises 处理用户定义的异常

java - 异常似乎终止了 JList 的更新

Delphi:弹出菜单

delphi - TWebBrowser 可以撤消或重做

hadoop - 在 Hadoop 中运行 pyspark 时不是文件异常