2

TDateTime変換の例外をトラップせずに、Delphi変数に有効な内容があるかどうかを確認する方法はありますか?

フィールドを含む生のDelphiレコードとして書き込まれた何百もの巨大なファイルを解析する必要があるアプリケーションを作成しましたTDateTime。ときどき、変換ルーチンに渡されたときに例外を与えるTDateTimeような値を持つコンテンツを取得するレコードを取得します。例外を単純にトラップできることはわかっていますが、これは、デバッガーが停止し続けるため、デバッグ時に非常に厄介であり、他のエラーが発生した場合に備えて有効にしておく必要があります。2.0927117954e+262Floating point invalid Operation

4

3 に答える 3

11

あなたの例の値は明らかに有効な DateTime 範囲外です。変換を実行する前に、範囲内にあるかどうかをテストできます。

var
  d: TDateTime;
..

d := 2.0927117954e+262;
if (d <= MaxDateTime) and (d >= MinDateTime) then
  s := DateTimeToStr(d)
else
  ..
于 2012-07-31T21:07:14.377 に答える
5

問題がデバッガの停止である場合は、それ以降の Delphi バージョンの IDE で修正できます。例外が発生する行の前後に 2 つのブレークポイントを設定します。たとえば、Delphi 2007 では、最初の BP の余白の赤い点を右クリックし、[ブレークポイント プロパティ]/[詳細設定]/[後続の例外を無視] を選択します。2 番目の BP で、「後続の例外を処理する」

于 2012-08-01T09:23:08.990 に答える
4

問題の説明を読んで、一部のレコードに破損/無効な時間値が含まれている場合、アプリケーションがファイルの読み取りを続行することは絶対に有効であり、スキップしたい(そうでない場合は問題をマークまたは収集する)ことが絶対に有効であると結論付けます。

VCL 関数System.SysUtils.TryFloatToDateTimeはまさにこの目的のために作成されたものであり、それを使用することは私にとって断然最良の選択肢のようです。

Delphi の例:

uses SysUtils;

function IsValidDateTime(dt: Double): Boolean;
var
  dummy: TDateTime;
begin
  Result := TryFloatToDateTime(dt, dummy);
end;

C++ ビルダーの例:

#include <SysUtils.hpp>

bool isValidDateTime(const double dt) 
{
    TDateTime dummy;
    return TryFloatToDateTime(dt, dummy);
}

この関数は便利なだけでなく (例外がなく、既に存在するため)、非常に読みやすく、フレームワーク全体で実行される優れた規則に従っています。

  • 名前はTry失敗する可能性があると言って始まります
  • Boolean有効な操作を示す直接的な結果
  • 間接的な結果は実際の値を取得します (操作が成功した場合)
于 2014-09-05T09:45:05.433 に答える