我熟悉Jeff Atwood 关于错误总是程序员的错的文章,但我确信在 Delphi .pas 文件中发现了一个真正的 bug。
具体来说,我正在使用 Delphi 2007,错误出现在 DBCommon.pas 文件的第 955 行,该文件位于我的计算机上的以下位置:
C:\program files\codegear\rad studio\5.0\source\Win32\db\DBCommon.pas
代码如下:
如果“Token”的值为零,则尝试访问DataSet.Fields的索引-1,导致列表索引越界错误。由于此错误在上升到用户之前被处理,因此不会向用户引发异常,但每次发生这种情况时,调试器中断非常恼人。我可以“忽略此异常类型”,但是索引越界错误很常见,因此我不想普遍忽略它们。导致FieldIndex为零的情况是具有包含函数的ORDER BY的SELECT语句,如:
我可以修复DBCommon.pas中的错误,但Delphi不会重新编译自己,并且我的更改不会生效。如果我重命名.DCU文件,那么它只会抱怨找不到“DBCommon.dcu”。所以(最终)我的问题是:我可以重新编译带有我的修复的DBCommon.pas吗?如果可以,如何操作?
具体来说,我正在使用 Delphi 2007,错误出现在 DBCommon.pas 文件的第 955 行,该文件位于我的计算机上的以下位置:
C:\program files\codegear\rad studio\5.0\source\Win32\db\DBCommon.pas
代码如下:
...
FieldIndex := StrToInt(Token);
if DataSet.FieldCount >= FieldIndex then
LastField := DataSet.Fields[FieldIndex-1].FieldName else
...
如果“Token”的值为零,则尝试访问DataSet.Fields的索引-1,导致列表索引越界错误。由于此错误在上升到用户之前被处理,因此不会向用户引发异常,但每次发生这种情况时,调试器中断非常恼人。我可以“忽略此异常类型”,但是索引越界错误很常见,因此我不想普遍忽略它们。导致FieldIndex为零的情况是具有包含函数的ORDER BY的SELECT语句,如:
ORDER BY
CASE WHEN FIELD1 = FIELD3 THEN 1 ELSE 2 END
,CASE WHEN FIELD2 = FIELD4 THEN 1 ELSE 2 END
我可以修复DBCommon.pas中的错误,但Delphi不会重新编译自己,并且我的更改不会生效。如果我重命名.DCU文件,那么它只会抱怨找不到“DBCommon.dcu”。所以(最终)我的问题是:我可以重新编译带有我的修复的DBCommon.pas吗?如果可以,如何操作?