有没有办法在不捕获转换异常的情况下检查Delphi TDateTime变量是否包含有效内容?
我写了一个应用程序,它必须解析数以百计的大型文件,这些文件被写成包含TDateTime字段的原始Delphi记录。偶尔我会得到一个记录,其中的内容有一个TDateTime值,比如2.0927117954e+262,它在传递给转换例程时会给出一个Floating point invalid Operation异常。我知道我可以简单地捕获异常,但这在调试时非常麻烦,因为调试器一直在停止,我希望在发生其他错误的情况下保持启用它。
发布于 2012-08-01 05:07:14
您的示例值显然超出了有效的DateTime范围。您可以在执行任何转换之前测试它是否在范围内。
var
d: TDateTime;
..
d := 2.0927117954e+262;
if (d <= MaxDateTime) and (d >= MinDateTime) then
s := DateTimeToStr(d)
else
..发布于 2012-08-01 17:23:09
如果您的问题是调试器停止,您可以在更高版本的Delphi的IDE中修复该问题。在将发生异常的行前和行后设置两个断点。例如,在Delphi2007中,右键单击第一个BP的边距红点,选择BreakPoint属性/高级/忽略后续异常。在第二个BP中,“处理后续异常”
发布于 2014-09-05 17:45:05
阅读你的问题描述,我得出的结论是,如果某些记录有损坏/无效的时间值,所以你想跳过它(可以标记或收集问题),那么你的应用程序继续读取文件是绝对有效的。
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开头,表示它可以直接执行结果,以指示有效的结果获取实际值(如果操作成功)https://stackoverflow.com/questions/11747813
复制相似问题