有没有一种方法可以检查Delphi TDateTime变量是否具有有效内容,而不会在转换时捕获异常?
我已经编写了一个应用程序,该应用程序必须解析成百个巨大的文件,这些文件被编写为包含TDateTime字段的原始Delphi记录。有时,我得到一条记录,其中的内容具有TDateTime值,如2.0927117954e + 262,该值在传递给转换例程时会给出Floating point invalid Operation
异常。我知道我可以简单地捕获该异常,但这在调试时非常麻烦,因为调试器不断停止,并且我想在其他错误的情况下保持启用状态。
您的示例值显然超出有效的DateTime范围。您可以在执行任何转换之前测试它是否在范围内。
var
d: TDateTime;
..
d := 2.0927117954e+262;
if (d <= MaxDateTime) and (d >= MinDateTime) then
s := DateTimeToStr(d)
else
..
如果您的问题是调试器停止,则可以在更高Delphi版本的IDE中进行修复。在发生异常的行的前后设置两个断点。例如。在Delphi 2007中,右键单击第一个BP的空白红点,选择BreakPoint属性/高级/忽略后续异常。在第二个BP上,“处理后续异常”
VCL函数System.SysUtils.TryFloatToDateTime正是为此目的而制作的,到目前为止,使用它似乎是您情况下的最佳选择。
Delphi示例:
uses SysUtils;
function IsValidDateTime(dt: Double): Boolean;
var
dummy: TDateTime;
begin
Result := TryFloatToDateTime(dt, dummy);
end;
C ++ Builder示例:
#include <SysUtils.hpp>
bool isValidDateTime(const double dt)
{
TDateTime dummy;
return TryFloatToDateTime(dt, dummy);
}
此函数不仅方便(因为没有异常,而且已经存在),而且可读性很强,它遵循贯穿整个框架的良好约定:
Try
开头表示可能失败Boolean
直接结果表示有效操作