1

多数のフォームとユニット(インターフェイスなし)を含むデルファイプロジェクトがあります。「{$ RangeCheckson}」を配置したフォームは範囲外の例外をキャッチしますが、クラスを含むユニットに追加すると、キャッチされません。例外をキャッチします。そのユニットのインデックス例外をキャッチするのに役立ちますか?

4

1 に答える 1

2

例外をキャッチtryするには、 -exceptブロックを記述する必要があります。

try
  // call code that fails range checks
except
  on E: ERangeError do
    // ...
end;

コードがこれらの例外をスローすることを確認するには、次の2つのことを行う必要があります。

  1. 範囲チェックが有効になっていることを確認してください。$RANGECHECKS(別名$R)コンパイラ指令を使用してこれを行う1つの方法。ユニットのどこにでも配置できます。たとえば、上部や、チェックするコード行の直前などです。これは、コンパイラがそれをオフにする別のディレクティブ(のような)に遭遇するまで、現在のユニットでそれに続くすべてのコードに適用されます{$R-}

    すべてのユニットの一番上に配置する予定の場合は、プロジェクトのコンパイラオプションを編集することで、私が行ったことを実行し、グローバルに有効にすることができます。(そこにいる間は、オーバーフローチェックと「typed @operator」も有効にすることをお勧めします。)

  2. 型または配列の範囲に違反するコードを実行します。大きな整数値を小さな型に割り当て、負の値を符号なし型に割り当てます。コンパイル時に長さがわかっている動的配列または固定サイズ配列の末尾を超えて読み取ります。

これは、ユニットの目的やユニットに含まれるコードの種類とは関係ありません。範囲チェックオプションは、フォームを定義するユニット、データモジュールを定義するユニット、デザイン時オブジェクトをまったく定義しないユニットなど、あらゆる種類のユニットに等しく適用されます。ユニット内のコードの種類が範囲チェックオプションの動作に影響を与えていると思われる場合は、調査が必要な他の問題があります。

于 2012-09-13T13:56:25.903 に答える