ABAP Help Document(14):7.Program程序流控制

7. Program Flow

7.1Logical Expresssions

          参考1.2表达式中逻辑表达式。

7.2 Control Structures

    分支语法:if,case;

示例:

"Branch
"分支语法
"if语法:
*IF log_exp1. 
*  [statement_block1] 
*[ELSEIF log_exp2. 
*  [statement_block2]] 
*... 
*[ELSE. 
*  [statement_blockn]] 
*ENDIF.
"case语法:
*CASE operand. 
*  [WHEN operand1 [OR operand2 [OR operand3 [...]]]. 
*    [statement_block1]] 
*  ... 
*  [WHEN OTHERS. 
*    [statement_blockn]] 
*ENDCASE. 
FORM f_branch.
  "if语句
  IF 1 > 0.
    ...
  ELSEIF 1 < 0.
    ...
  ELSE.
    ...
  ENDIF.
  "case语句
  DATA:lv_char TYPE C LENGTH 1.
  CASE lv_char.
    WHEN '1' OR '3'.
    WHEN '2'.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.

    循环语法:do,while,loop,provide,select

示例:

"循环语法
"do语法:
*DO [n TIMES]. 
*  [statement_block] 
*ENDDO. 
"while语法:
*WHILE log_exp 
*  [statement_block] 
*ENDWHILE. 

    程序中断

示例:

"程序中断
"语法
*WAIT UP TO sec SECONDS.  

7.3 Exception Handling

    异常分为可处理异常,不可处理异常。

        可处理异常被ABAP运行时环境抛出,通过Program Raise Exception抛出,通过Try catch entry捕捉异常。

        所有异常类父类,CX_ROOT。

异常种类:

CX_STATIC_CHECK

CX_DYNAMIC_CHECK

CX_NO_CHECK

    SE24,Class Builder创建异常全局类或Program里创建本地异常类。以CX_, YCX_, ZCX_开头。

示例:

"Exception
"抛出异常
*RAISE [RESUMABLE] EXCEPTION
*  { {TYPE cx_class [EXPORTING p1 = a1 p2 = a2 ...]}
*  | oref }.
"try 捕获异常
*TRY.
*    [try_block]
*  [CATCH [BEFORE UNWIND] cx_class1 cx_class2 ... [INTO oref].
*    [catch_block]]
*    ...
*  [CLEANUP [INTO oref].
*    [cleanup_block]]
*ENDTRY.
CLASS zcx_exeception DEFINITION INHERITING FROM CX_STATIC_CHECK.
  PUBLIC SECTION.
    DATA: message TYPE string.
    METHODS:constructor IMPORTING iv_msg TYPE string.
ENDCLASS.
CLASS zcx_exeception IMPLEMENTATION.
  METHOD constructor.
    super->constructor( ).
    me->message = iv_msg.
  ENDMETHOD.
ENDCLASS.

CLASS zcl_test_exception DEFINITION.
  PUBLIC SECTION.
    METHODS:meth1 RAISING zcx_exeception.
    METHODS:meth2 RAISING RESUMABLE(zcx_exeception).
ENDCLASS.
CLASS zcl_test_exception IMPLEMENTATION.
  METHOD meth1.
    DATA:lo_exec TYPE REF TO zcx_exeception.
    TRY.
      RAISE EXCEPTION TYPE zcx_exeception EXPORTING iv_msg = 'no resumable exception'.
    CATCH BEFORE UNWIND zcx_exeception INTO lo_exec.
      WRITE:/ lo_exec->message.
    ENDTRY.
  ENDMETHOD.
  METHOD meth2.
    DATA:lo_exec TYPE REF TO zcx_exeception.
    TRY.
      RAISE RESUMABLE EXCEPTION TYPE zcx_exeception EXPORTING iv_msg = 'resumable exception'.
    CATCH zcx_exeception INTO lo_exec.
      WRITE:/ lo_exec->message.
    ENDTRY.
  ENDMETHOD.
ENDCLASS.

"抛出exception
FORM f_raise_exception.
  DATA:lo_exc TYPE REF TO zcx_exeception.
  TRY.
    "抛出异常
    RAISE EXCEPTION TYPE zcx_exeception EXPORTING iv_msg = 'test'.
  CATCH zcx_exeception INTO lo_exc.
    WRITE:/ lo_exc->message.
  ENDTRY.

  DATA:lo_test_exception TYPE REF TO zcl_test_exception.
  CREATE OBJECT lo_test_exception.
  TRY .
    lo_test_exception->meth1( ).
    lo_test_exception->meth2( ).
  CATCH zcx_exeception INTO lo_exc.
    WRITE:/ lo_exc->message.
  ENDTRY.
ENDFORM.

ABAP Exception异常树:

CX_ROOT
  |--CX_STATIC_CHECK
  |--CX_DYNAMIC_CHECK
  |    |--CX_SY_ARITHMETIC_ERROR
  |    |    |--CX_SY_ZERODIVIDE
  |    |    |--CX_SY_ARITHMETIC_OVERFLOW
  |    |    |--CX_SY_ARG_OUT_OF_DOMAIN
  |    |    |--CX_SY_PRECISION_LOSS
  |    |--CX_SY_ASSIGN_ERROR
  |    |    |--CX_SY_ASSIGN_CAST_ERROR
  |    |    |    |--CX_SY_ASSIGN_CAST_ILLEGAL_CAST
  |    |    |    |--CX_SY_ASSIGN_CAST_UNKNOWN_TYPE
  |    |    |--CX_SY_ASSIGN_OUT_OF_RANGE
  |    |--CX_SY_CODEPAGE_CONVERTER_INIT
  |    |--CX_SY_CONVERSION_ERROR
  |    |    |--CX_SY_CONVERSION_CODEPAGE
  |    |    |--CX_SY_CONVERSION_CODEPAGE_EX
  |    |    |--CX_SY_CONVERSION_DATA_LOSS
  |    |    |--CX_SY_CONVERSION_EXACT_NOT_SUP
  |    |    |--CX_SY_CONVERSION_INEXACT_FLTP
  |    |    |--CX_SY_CONVERSION_NO_BOOLEAN
  |    |    |--CX_SY_CONVERSION_NO_DATE_TIME
  |    |    |--CX_SY_CONVERSION_NO_NUMBER
  |    |    |--CX_SY_CONVERSION_NO_QNAME
  |    |    |--CX_SY_CONVERSION_NO_RAW
  |    |    |--CX_SY_CONVERSION_NO_TIME
  |    |    |--CX_SY_CONVERSION_NO_UUID
  |    |    |--CX_SY_CONVERSION_OVERFLOW
  |    |    |--CX_SY_CONVERSION_ROUNDING
  |    |    |--CX_SY_CONVERSION_SRC_TOO_SHORT
  |    |    |--CX_SY_CONVERSION_UNKNOWN_LANGU
  |    |--CX_SY_CREATE_ERROR
  |    |    |--CX_SY_CREATE_OBJECT_ERROR
  |    |    |--CX_SY_CREATE_DATA_ERROR
  |    |--CX_SY_DATA_ACCESS_ERROR
  |    |    |--CX_SY_RANGE_OUT_OF_BOUNDS
  |    |    |--CX_SY_TAB_RANGE_OUT_OF_BOUNDS
  |    |    |--CX_SY_OFFSET_NOT_ALLOWED
  |    |--CX_SY_DYN_CALL_ERROR
  |    |    |--CX_SY_DYN_CALL_ILLEGAL_CLASS
  |    |    |--CX_SY_DYN_CALL_ILLEGAL_FORM
  |    |    |--CX_SY_DYN_CALL_ILLEGAL_FUNC
  |    |    |--CX_SY_DYN_CALL_ILLEGAL_METHOD
  |    |    |--CX_SY_DYN_CALL_PARAMETER_ERROR
  |    |         |--CX_SY_DYN_CALL_EXCP_NOT_FOUND
  |    |         |--CX_SY_DYN_CALL_ILLEGAL_TYPE
  |    |         |--CX_SY_DYN_CALL_PARAM_MISSING
  |    |         |--CX_SY_DYN_CALL_PARAM_NOT_FOUND
  |    |--CX_SY_EXPORT_NO_SHARED_MEMORY
  |    |--CX_SY_FILE_ACCESS_ERROR
  |    |    |--CX_SY_FILE_AUTHORITY
  |    |    |--CX_SY_FILE_CLOSE
  |    |    |--CX_SY_FILE_IO
  |    |    |--CX_SY_FILE_OPEN
  |    |    |--CX_SY_FILE_OPEN_MODE
  |    |    |--CX_SY_FILE_POSITION
  |    |    |--CX_SY_FILE_TRUNCATE
  |    |--CX_SY_FIND_INFINITE_LOOP
  |    |--CX_SY_GEN_SOURCE_TOO_WIDE
  |    |--CX_SY_IMPORT_MISMATCH_ERROR
  |    |    |--CX_SY_IMPORT_FORMAT_ERROR
  |    |--CX_SY_ITAB_ERROR
  |    |    |--CX_SY_ITAB_DUPLICATE_KEY
  |    |    |--CX_SY_ITAB_DYN_LOOP
  |    |--CX_SY_MATCHER
  |    |    |--CX_SY_REGEX_TOO_COMPLEX
  |    |    |--CX_SY_INVALID_REGEX_FORMAT
  |    |--CX_SY_MOVE_CAST_ERROR
  |    |--CX_SY_PROGRAM_NOT_FOUND
  |    |--CX_SY_PROVIDE_EXCEPTION
  |    |    |--CX_SY_PROVIDE_INTERVAL_OVERLAP
  |    |    |--CX_SY_PROVIDE_TABLE_NOT_SORTED
  |    |--CX_SY_READ_SRC_LINE_TOO_LONG
  |    |--CX_SY_REF_IS_INITIAL
  |    |--CX_SY_REGEX
  |    |    |--CX_SY_INVALID_REGEX
  |    |--CX_SY_REPLACE_INFINITE_LOOP
  |    |--CX_SY_SCAN_SOURCE_TOO_WIDE
  |    |--CX_SY_SQL_ERROR
  |    |    |--CX_SY_OPEN_SQL_ERROR
  |    |    |    |--CX_SY_OPEN_SQL_DB
  |    |    |    |--CX_SY_DYNAMIC_OSQL_ERROR
  |    |    |         |--CX_SY_DYNAMIC_OSQL_SEMANTICS
  |    |    |         |--CX_SY_DYNAMIC_OSQL_SYNTAX
  |    |    |--CX_SY_NATIVE_SQL_ERROR
  |    |--CX_SY_UNKNOWN_CURRENCY
  |    |--CX_SY_WRITE_INVALID_STYLE
  |    |--CX_SY_WRITE_SRC_LINE_TOO_LONG
  |    |--CX_TRANSFORMATION_ERROR
  |         |--CX_ST_ERROR
  |         |    |--CX_ST_CALL_ERROR
  |         |    |--CX_ST_CALL_METHOD_ERROR
  |         |    |--CX_ST_CONSTRAINT_ERROR
  |         |    |--CX_ST_CONDITION
  |         |    |--CX_ST_DESERIALIZATION_ERROR
  |         |    |--CX_ST_FORMAT_ERROR
  |         |    |--CX_ST_INVALID_XML
  |         |    |--CX_ST_MATCH
  |         |    |--CX_ST_REF_ACCESS
  |         |    |--CX_ST_RUNTIME_ERROR
  |         |    |--CX_ST_SERIALIZATION_ERROR
  |         |--CX_XSLT_EXCEPTION
  |              |--CX_XSLT_SYSTEM_ERROR
  |                   |--CX_XSLT_ABAP_CALL_ERROR
  |                   |--CX_XSLT_DESERIALIZATION_ERROR
  |                   |--CX_XSLT_FORMAT_ERROR
  |                   |--CX_XSLT_RUNTIME_ERROR
  |                   |--CX_XSLT_SERIALIZATION_ERROR
  |         |--CX_SY_TRANS_OPTION_ERROR
  |--CX_NO_CHECK
       |--CX_BADI
       |    |--CX_BADI_CONTEXT_ERROR
       |    |--CX_BADI_FILTER_ERROR
       |    |--CX_BADI_INITIAL_CONTEXT
       |    |--CX_BADI_INITIAL_REFERENCE
       |    |--CX_BADI_NOT_SINGLE_USE
       |    |    |--CX_BADI_MULTIPLY_IMPLEMENTED
       |    |    |--CX_BADI_NOT_IMPLEMENTED
       |    |--CX_BADI_UNKNOWN_ERROR
       |--CX_SY_EXPORT_BUFFER_NO_MEMORY
       |--CX_SY_GENERATE_SUBPOOL_FULL
       |--CX_SY_ILLEGAL_HANDLER
       |--CX_SY_LOCALIZATION_ERROR
       |--CX_SY_NESTED_PRINT_ON
       |--CX_SY_NO_HANDLER
       |--CX_SY_PIPES_NOT_SUPPORTED
       |--CX_SY_PIPE_REOPEN
       |--CX_SY_REMOTE_CALL_ERROR
       |    |--CX_SY_RMC_COMM_FAILURE
       |    |--CX_SY_RMC_INVALID_STATUS
       |    |--CX_SY_RMC_SYSTEM_FAILURE
       |--CX_SY_TOO_MANY_FILES

原文地址:https://www.cnblogs.com/tangToms/p/14691147.html