发现很多人对这个基础问题还都搞不清楚,这里解释一下。
在 ABAP 的很多函数模块中都定义了异常(EXCEPTIONS 选项卡)。如果在程序中使用 CALL FUNCTION '<fm_name>' 的时候,指定了 EXCEPTION 段,并且将每个异常都对应了一个数字,则在函数模块调用中出现异常时,就会把该异常对应的数字填写到系统变量 sy-subrc 中。这样说比较抽象,看看下面这个例子就很容易明白了
Code
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* BIN_FILESIZE =
filename =
* FILETYPE = 'ASC'
* APPEND = ' '
* WRITE_FIELD_SEPARATOR = ' '
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* DAT_MODE = ' '
* CONFIRM_OVERWRITE = ' '
* NO_AUTH_CHECK = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* WRITE_BOM = ' '
* TRUNC_TRAILING_BLANKS_EOL = 'X'
* WK1_N_FORMAT = ' '
* WK1_N_SIZE = ' '
* WK1_T_FORMAT = ' '
* WK1_T_SIZE = ' '
* WRITE_LF_AFTER_LAST_LINE = ABAP_TRUE
* SHOW_TRANSFER_STATUS = ABAP_TRUE
* IMPORTING
* FILELENGTH =
tables
data_tab =
* FIELDNAMES =
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
这里,EXCEPTIONS 后面有 22 个异常,其中前 21 个是函数模块中定义的,最后一个 OTHER 是 SAP 规定的处理上述未包含的情况的。如果在函数执行中,发生了文件未找到异常(FILE_NO_FOUND),则 sy-subrc 的值就是19,在后面的 IF 结构中,就可以对 sy-subrc 为 19 的情况提示一下 “没有找到文件!”。
需要注意的是,数字和异常的对应是可以在程序代码里修改的,比如我们删除了 DP_OUT_OF_MEMORY 这个异常,并且把后面的数字都提前,变成:
Code
DISK_FULL = 16
DP_TIMEOUT = 17
FILE_NOT_FOUND = 18
DATAPROVIDER_EXCEPTION = 19
CONTROL_FLUSH_ERROR = 20
OTHERS = 21
.
则出现 FILE_NO_FOUND 时,sy-subrc 的值就是 18,后续处理判断也要相应修改。
手工添加异常语句比较麻烦,建议使用代码编辑器中的“模式”按钮添加函数模块调用,只需要输入函数名称,系统会根据它的定义自动为你生成完整的调用代码,非常方便。
一般来说,异常的名称就能说明具体问题,如果不能完全说明,还可以到函数定义中,点击每个异常最后的按钮查看其长文本。