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 が適切に割り当てられます。注: このケースは、1 つの 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 に答える