ABAP 退出指令大揭秘:RETURN、STOP、EXIT 等的深度解析

文摘   2024-12-02 19:34   上海  


一、引言


ABAP 开发中常常会用到各种退出指令,如 RETURN、STOP、EXIT、CHECK、LEAVE、REJECT 等。这些指令在不同的场景下有着不同的作用,准确理解和使用它们对于高效的 ABAP 编程至关重要。本文将对这些退出指令进行详细说明和对比。

在 ABAP 编程中,退出指令的正确使用可以提高程序的效率和可读性。例如,当需要在特定条件下提前退出一个循环或程序块时,选择合适的退出指令就显得尤为重要。

RETURN 指令用于退出当前执行的程序块,无论是在循环中还是在其他程序结构中。它的作用比较直接,会立即停止当前程序块的执行,并返回到调用该程序块的位置。如果在一个 FORM、METHOD 或报表事件块中使用 RETURN,它将退出整个 FORM、METHOD 或事件块,执行下一个 FORM(如果有)。

STOP 指令在不同的事件中有不同的效果。在 INITIALIZATION 事件中,STOP 会导致跳转到 at selection-screen output 事件块。如果在 at selection-screen output 块里或选择屏幕中的事件块中使用 STOP,它只是退出当前块,紧接着显示选择屏幕。即使 STOP 在循环中或 FORM、METHOD 中,也是直接从被调用点退出当前所在的事件块,而不仅仅只退出当前循环、FORM 或 METHOD。

EXIT 指令在循环中的作用是退出整个循环操作,程序会从循环结束处继续执行。如果 EXIT 出现在循环之外,它的作用与 RETURN 类似,退出当前执行的程序块,例如一个 FORM、METHOD 或 EVENT。需要注意的是,SAP 推荐只在循环中使用 EXIT,其他情况下要退出当前执行进程,使用 RETURN。

CHECK 指令在循环中的作用是当后面的条件为假时,退出当前的循环操作。如果 CHECK 出现在循环中,它只退出当前一次循环,程序会继续执行下一次循环操作,其作用类似于 Continue。如果 CHECK 出现在循环以外,它会退出当前执行的程序块,例如一个 FORM、METHOD 或 EVENT,其作用与 RETURN 类似。SAP 官方推荐只在循环中使用 CHECK。

LEAVE PROGRAM 指令则是直接退出主程序。它可以在需要立即终止整个程序执行的情况下使用。

REJECT 指令用在逻辑数据库的 GET event block 中。与 EXIT 和 CHECK 不同的是,REJECT 可以从循环或者一个 FORM 中直接跳出所在的 GET 事件块。


二、各个指令的具体说明


(一)CHECK


在循环中的作用:当 CHECK 后面的表达式值为假时,退出当前一次循环操作,程序会继续执行下一次循环操作,类似于 Continue。例如在循环处理中,CHECK 只是不执行本次循环的后续处理,继续调到下一次循环。

在循环外的作用:退出当前执行的程序块,例如一个 FORM、METHOD 或 EVENT。如果 CHECK 出现在循环以外,则发生作用时,退出的是当前执行的程序块,类似一个 FORM、METHOD 或 EVENT,其作用与 RETURN 类似。

在 START-OF-SELECTION、GET、END-OF-SELECTION 事件中的作用:只是中断本事件内的后续代码的执行,不影响其他后续模块的处理。对逻辑数据库的 GET 事件,系统退出本次纪录和子节点的读取处理,将继续下一条纪录的处理。

CHECK跳转的前提是<expr>为假时。l  CHECK只是跳出当前事件块,继续下一个事件块的处理,相当于方法的returnl  另外,如果CHECK在循环(DO、WHILE、LOOP)里,只是跳出当前循环而已;l  如果CHECK出现在循环以外,退出的是当前执行的程序块(processing block),例如一个FORM,METHOD,或EVENT。


(二)EXIT


在循环中的作用:退出整个循环操作,程序会从循环结束处开始继续执行。在循环处理中,EXIT 只跳出当前的循环继续执行 loop 外的语句,其作用相当于 Java 与 C++ 中的 break。

在循环外的作用:退出当前执行的程序块,例如一个 FORM、METHOD 或 EVENT,其作用与 RETURN 类似。

l  INITIALIZATION中的EXIT会导致跳转到AT SELECTION-SCREEN OUTPUT事件块;l  如果EXIT在AT SELECTION-SCREEN OUTPUT块里,则只是退出当前块(EXIT后面语句不执行而已),仅接着是显示选择屏幕;l  AT SELECTION-SCREEN [ON]…选择屏幕事件块中的EXIT也只是退出当前事件块,继续后面的事件块;l  从START-OF-SELECTION开始往后的事件块,如果出现EXIT,则会开始listprocessor(列表处理),并跳转到相应的List输出界面(前提条件是要在退出前已经向屏幕输出内容了,否则也不会跳转);注:END-OF-SELECTION事件块也会被跳过l  另外,如果EXIT在循环(DOWHILE、LOOP)里,只是跳出当前循环而已;l  如果是在FORM,METHOD中,而非循环中,则退出当前的FORM、METHOD,其作用与RETURN类似


(三)RETURN


在处理模块中的作用:无条件退出当前的处理模块,不影响后续模块的执行。对于 procedure,RETURN 将无条件退出当前的处理模块。

在 START-OF-SELECTION、GET、END-OF-SELECTION 事件中的作用:将直接触发 List 输出,将不执行 END-OF-SELECTION 事件;如果没有 List 输出,系统将直接返回选择屏幕。

RETURN用来退出当前执行的程序块,例如一个FORM、METHOD、报表事件块,不管是否出现在循环(LOOP)中,RETURN都会退出当前执行的程序块,而不仅仅是退出循环(如果是在Form、METHOD中,只会退出Form、METHOD,不会退出Form、METHOD被调用所在的报表事件块,即退Form、METHOD后继续向被调用点后面执行)


(四)STOP


在 INITIALIZATION 事件中的作用:系统将直接触发应用服务器和客户端屏幕元素的发送。

在其他事件中的作用:将直接触发 END-OF-SELECTION 事件的执行,如果不想执行 END-OF-SELECTION,请使用 RETURN 或者 EXIT。

l  INITIALIZATION中的STOP会导致跳转到AT SELECTION-SCREEN OUTPUT事件块;l  如果STOP在AT SELECTION-SCREEN OUTPUT块里,则只是退出当前块(STOP后面语句不执行而已),仅接着是显示选择屏幕;l  AT SELECTION-SCREEN [ON]…选择屏幕事件块中的STOP也只是退出当前事件块,继续后面的事件块;l  另外,即使STOP在循环中,还是在FORM,METHOD,也是直接从被调用的点退出所在事件块,而不仅仅只退出当前循环、FORM、METHOD,这与直接在事件块中的效果是一样的;


(五)LEAVE


LEAVE PROGRAM:退出整个程序。

LEAVE TO TRANSACTION ta:跳转到指定事务。

LEAVE LIST-PROCESSING:从 list processor 回到 dialog processor;LEAVE TO LIST-PROCESSING 控制权从 dialog processor 转交给 list processor。

LEAVE {SCREEN | {TO SCREEN dynnr} }:退出屏幕或跳转到指定屏幕。

LEAVE PROGRAM. 退出整个程序LEAVE TO TRANSACTION taLEAVE LIST-PROCESSING.          从list processor回到dialog processorLEAVE TO LIST-PROCESSING    控制权从dialog processor转交给list processorLEAVE { SCREEN | {TO SCREEN dynnr} }


(六)REJECT


在逻辑数据库的 GET 处理事件中的作用:处理类似 CHECK,但和 CHECK 不同的是,REJECT 如果在循环内也同样退出本次的处理,而 CHECK 只是退出循环,不退出处理。

REJECT

REJECT是用在逻辑数据库GET event blocks中,与EXIT和CHECK不一样的是(EXIT和CHECK如果是在循环中时,只是退出循环;如果是在FORM中,则只是退出当前FORM),REJECT可以从循环或者一个FORM中直接跳出所在的GET事件块:


REJECT [<dbtab>].

终结逻辑数据库当前节点数据行的处理

如果省略选项<dbtab>, 则逻辑数据库会自动读取同一节点的下一行数据,即同一节点的GET事件块会被触发。如果使用了<dbtab>选项,则逻辑数据库会读取节点<dbtab>的下一行数据,此时的<dbtab>节点必须是REJECT所在当前节点的上级节点。


(七)RAISE EXCEPTION


用于抛出异常来中断程序的正常执行流程。当程序执行到 RAISE EXCEPTION 语句时,会触发异常处理机制。如果异常没有在当前程序块中被捕获和处理,程序会终止当前处理过程,并根据异常传播规则将异常传递到更高层次的调用程序中进行处理。


三、指令对比


1. 在循环中的表现对比


CHECK:只是不执行本次循环的后续处理,继续调到下一次循环。例如在循环处理中,当 CHECK 后面的条件为假时,程序会直接跳过本次循环的剩余部分,进入下一次循环。

EXIT:只跳出当前的循环继续执行 loop 外的语句。在循环中使用 EXIT 时,程序会立即退出当前循环,从循环结束处继续执行后续代码。其作用相当于 Java 与 C++ 中的 break。

RETURN:不管存在多少层次的循环,将直接退出当前处理模块。如果在循环中使用 RETURN,程序会立即终止当前的处理模块,而不仅仅是退出循环。


2. 在事件中的表现对比


CHECK:在 START-OF-SELECTION、GET、END-OF-SELECTION 事件中,只是中断本事件内的后续代码的执行,不影响其他后续模块的处理。对逻辑数据库的 GET 事件,系统退出本次纪录和子节点的读取处理,将继续下一条纪录的处理。

EXITRETURN:在这些事件中,将直接触发 List 输出,将不执行 END-OF-SELECTION 事件;如果没有 List 输出,系统将直接返回选择屏幕。例如在 START-OF-SELECTION 事件中,如果使用 EXIT 或 RETURN,程序会立即触发 List 输出或者返回选择屏幕,而不会执行 END-OF-SELECTION 事件。


四、总结


在 ABAP 编程中,RETURN、STOP、EXIT、CHECK、LEAVE、REJECT 等退出指令各有其特定的用途和使用场景。准确掌握这些指令,能够根据不同的编程需求选择合适的指令,提高编程效率和代码质量。


例如,在需要提前退出循环时,可以根据具体情况选择 CHECK、EXIT 或 CONTINUE。如果只是想跳过当前循环的后续处理,继续下一次循环,可以使用 CHECK 或 CONTINUE;如果要完全退出循环,则可以使用 EXIT。而在需要退出整个程序或特定的处理模块时,可以使用 LEAVE PROGRAM 或 RETURN。


在实际应用中,要遵循 SAP 的推荐用法,确保程序的稳定性和可维护性。例如,SAP 推荐只在循环中使用 CHECK 和 EXIT,其他情况下要退出当前执行进程,使用 RETURN。同时,要注意各个指令在不同事件中的作用和影响,避免出现意外的结果。


总之,熟练掌握 ABAP 中的这些退出指令,能够帮助开发者更加高效地进行编程,提高程序的质量和可维护性。

曰天曰地
我要到哪里去↔️ 灵台方寸山,斜月三星洞。假如有一天全人类不存在,怎么证明人类存在过。AI怎么考古?会怎么考古⚠️
 最新文章