从处理块之外的过程中捕获错误

时间:2017-11-26 02:51:09

标签: openedge progress-4gl

我有以下代码(为了便于说明,它已被简化)。我在proc1,proc2和proc3中的不同数据库表中创建记录。我想要实现的是......如果我在任何时候循环访问临时表时遇到错误(即使我已经创建了一堆数据库记录),我想要回滚一切,所以没有记录是创建。如果proc1,proc2和proc3没有问题,它会捕获错误,但我无法弄清楚如何将这些错误传递给主处理块,以便它理解它并将所有内容卷回来。换句话说,消息('错误@ main trans block')永远不会弹出,因此已创建的记录会保留在DB中。事实上,没有任何东西可以回滚。

DO TRANSACTION ON ERROR UNDO, THROW:

    FOR EACH tt1:

        RUN proc1.

        FOR EACH tt2 WHERE tt2.field1 EQ tt1.field1:

            RUN proc2.

            FOR EACH tt3 WHERE tt3.field2 EQ tt2.field2:

                RUN proc3.

            END.

        END.

    END.

    CATCH e AS PROGRESS.Lang.AppERROR:

        MESSAGE 'error @ main trans block'
            VIEW-AS ALERT-BOX INFO BUTTONS OK.

    END CATCH. 

END.

PROCEDURE proc1.
    DO TRANSACTION ON ERROR UNDO, THROW:

        /* creating some DB records */

        CATCH e AS PROGRESS.Lang.ERROR:

            RETURN ERROR 'Proc1 ' + e:getmessage(1). 

        END CATCH. 

    END.

END PROCEDURE.

PROCEDURE proc2.
    DO TRANSACTION ON ERROR UNDO, THROW:

        /* creating some DB records */

        CATCH e AS PROGRESS.Lang.ERROR:

            RETURN ERROR 'Proc2 ' + e:getmessage(1). 

        END CATCH. 

    END.

END PROCEDURE.

PROCEDURE proc3.
    DO TRANSACTION ON ERROR UNDO, THROW:

        /* creating some DB records */

        CATCH e AS PROGRESS.Lang.ERROR:

            RETURN ERROR 'Proc3 ' + e:getmessage(1). 

        END CATCH. 

    END.

END PROCEDURE.

TIA

1 个答案:

答案 0 :(得分:1)

有几个潜在的问题。

首先,需要在没有var readings = [Double]() 标志的情况下定义临时表tt1和tt2。

其次,FOR EACH块正在使用它们的默认错误处理行为,即NO-UNDO因此,FOR EACH块中引发的错误将导致当前迭代被撤消,而不是整个事务。

我建议添加

ON ERROR UNDO, NEXT.

到程序的顶部。或者至少

BLOCK-LEVEL ON ERROR UNDO, THROW . 

与所有ROUTINE-LEVEL ON ERROR UNDO, THROW . 块上的ON ERROR UNDO, THROW选项结合使用。

自OpenEdge 11.3(左右)以来,FOR EACH错误处理选项可用。