OpenEdge ABL循环遇错误后终止执行的问题及原因咨询
问题分析与解决
你的循环只执行一次就停止,核心问题是**DO WHILE块上的ON ERROR UNDO, NEXT和内部CATCH块的冲突,以及NEXT关键字在循环块错误处理中的行为不符合预期**。
具体原因:
- Progress中,当给
DO WHILE这类循环块直接添加ON ERROR子句时,ON ERROR会优先捕获块内所有错误,内部的CATCH块根本不会触发。 - 这里的
NEXT关键字在ON ERROR子句中作用于循环块时,并不是“进入下一次迭代”,而是终止当前整个DO WHILE块的执行,所以第一次错误触发后,循环直接停止。 - 最顶部的
block-level on error undo, throw是全局默认错误处理,但本次问题的核心出在局部循环块的错误处理逻辑上。
修复方案:
你提到的“添加额外DO块”是正确做法,通过内部DO块隔离可能出错的代码,让错误被限制在小范围内处理,不影响外部循环的继续执行。修改后的代码示例:
block-level on error undo, throw. define variable cnt as integer no-undo. loop: do while true: cnt = cnt + 1. display cnt. if cnt >= 5 then leave. // 用内部DO块包裹可能出错的代码,隔离错误 do on error undo, next: integer ("abc"). end. catch e as Progress.Lang.Error : message "error in loop" cnt skip e:getmessage(1) skip view-as alert-box. next loop. end catch. end.
也可以去掉DO WHILE的ON ERROR,直接用CATCH处理内部错误,逻辑更直观:
block-level on error undo, throw. define variable cnt as integer no-undo. loop: do while true: cnt = cnt + 1. display cnt. if cnt >= 5 then leave. do: integer ("abc"). end. catch e as Progress.Lang.Error : message "error in loop" cnt skip e:getmessage(1) skip view-as alert-box. next loop. end catch. end.
为什么需要额外DO块?
Progress的错误处理基于块级作用域:错误会向上冒泡到最近的带有ON ERROR或CATCH的块。如果直接在DO WHILE块内触发错误且无内部块隔离,错误处理逻辑会直接作用于整个循环块,导致循环终止。而内部DO块可以把错误限制在自身范围内,处理完错误后,外部的DO WHILE循环能正常进入下一次迭代。
内容的提问来源于stack exchange,提问作者carl verbiest
相关产品推荐
相关产品推荐

