E2145 例外の再生成は例外ハンドラ内でのみ許されます (Delphi)

提供: RAD Studio
移動先: 案内検索

エラーと警告のメッセージ(Delphi) への移動

例外を再生成する raise 文の構文を使用しましたが,コンパイラはその再生成が例外処理ブロックの外で起きたと判断しました。現在の例外処理メカニズムの制約により,ネストした例外ハンドラからの例外の再生成はできません。


program Produce;

  procedure RaiseException;
  begin
    raise;            (*ケース 1*)
    try
      raise;          (*ケース 2*)
    except
      try
        raise;        (*ケース 3*)
      except
      end;
      raise;
    end;
  end;


begin
end.

{ このエラーにはいくつかの原因が考えられる。第 1 に例外ハンドラの外部で例外コンストラクタを持たない raise を指定した可能性がある。第 2 に例外ハンドラの try ブロックで例外を再生成しようとした可能性がある。第 3 に別の例外ハンドラの中にネストした例外ハンドラの中で例外を再生成しようとした可能性がある }


program Solve;
  uses SysUtils;

  procedure RaiseException;
  begin
    raise Exception.Create('case 1');
    try
      raise Exception.Create('case 2');
    except
      try
        raise Exception.Create('case 3');
      except
      end;
      raise;
    end;
  end;

begin
end.

このエラーでは新しい例外を明示的に生成するのが 1 つの解決方法である。「case 1」と「case 2」のような場合はそれを意図したと思われる。「case 3」の場合には,コードを調べて求める結果が得られるような適切な回避方法を判別する必要がある