Delphi 2006迁移至Delphi 11:Range Check Error定位求助
Delphi 11迁移时Range Check Error的定位与修复
快速定位错误行的实用方法
- 启用调试器的范围检查中断:在Delphi 11的项目选项中,确认「范围检查(Range Checking)」已开启(旧项目迁移后可能默认关闭,手动去「编译器选项」里找)。运行程序触发错误时,调试器会直接停在引发错误的代码行,一步到位。
- 添加ERangeError异常断点:打开IDE的「断点」面板,新增一个异常断点,指定异常类型为
ERangeError。之后程序一触发范围检查错误就会自动中断在出错位置,精准定位问题代码。 - 临时加日志排查:如果某些场景无法用调试器覆盖,就在可疑的字符串、数组操作代码前后,输出关键变量值(比如你代码里的
pos和Length(input))到日志,快速找出越界的情况。
字符串操作引发错误的常见修复
你给出的代码示例就是典型的字符串索引越界:
function TForm1.test(input: string; pos: integer): string; begin abcd('Input Char > ' + input[pos]); ...
这里pos的值超出了input字符串的有效索引范围(Delphi字符串索引从1开始,最大到Length(input))。修复可以这么做:
- 加边界判断:访问字符串前先校验
pos的合法性:if (pos >= 1) and (pos <= Length(input)) then abcd('Input Char > ' + input[pos]) else abcd('无效位置:' + IntToStr(pos)); - 局部关闭范围检查(谨慎使用):如果旧代码确实依赖无范围检查的行为,可以在函数开头加
{$R-}指令临时关闭范围检查,函数结尾用{$R+}恢复。但这会隐藏潜在的越界风险,只建议在确认安全的代码段使用。
内容的提问来源于stack exchange,提问作者user14668421
相关产品推荐
相关产品推荐

