您的位置:首页 > 其它

宏及其函数基础知识

2011-08-09 20:44 302 查看
宏定义(macro)

DEFINE~END-OF-DEFINITION

相同命令体2次以上执行的时候,可以使用宏定义来实现。

宏定义必须在宏调用之前,宏定义中最多可使用9个占位符(相当于变量名),&1~&9。

宏定义在程序执行时不能使用断点调试,因此,应尽量使宏定义简单明了,或是尽可能的用函数等替代。



DATA: result TYPE i,
n1 TYPE i VALUE 5,
n2 TYPE i VALUE 6.

DEFINE operation.
result = &1 &2 &3.
output &1 &2 &3 result.
END-OF-DEFINITION.

DEFINE output.
write: / 'The result of &1 &2 &3 is', &4.
END-OF-DEFINITION.

operation 4 + 3.
operation 2 ** 7.
operation n2 - n1.



函数调用

Ø 内部函数调用

PERFORM 函数名

Ø 外部函数调用

PERFORM 函数名(Program名) IF FOUND.
Ø 根据函数变量名调用

PERFORM (函数变量名) IN PROGRAM (Program名) IF FOUND.
Ø 函数连续调用

PERFORM (INDEX) OF 函数名1 函数名2….

例外处理

Ø 6。1版本之前

CATCH SYSTEM-EXCEPTIONS [exc1 = n1 exc2 = n2 ...]

[OTHERS = n_others].

[statement_block]

ENDCATCH.

IF SY-SUBRC = n1.

ENDIF.



例外发生时,[statement_block]中的执行会被强制终了,但CATCH ENDCATCH之

后命令还将被执行。捕捉到的例外按次序与[exc1 = n1 exc2 = n2 ...]中的例外

类型进行比较,若匹配成功,将数值n1,n2…赋值给sy-subrc.若匹配不成功,则程序

被强制终了,因此以防万一,一般在例外LIST中加入[OTHERS = n_others]。



Ø 6。1版本之后

TRY.

[try_block]

[CATCH cx_class1 cx_class2 ... [INTO oref].

[catch_block]]

...

[CLEANUP [INTO oref].

[cleanup_block]]

ENDTRY.



TRY CATCH的命令与J***A中的非常相似,这里不再多做解释。

重点介绍一下关键字CLEANUP。

首先,CLEARUP是在什么时候被执行的?

CLEARUP是在所在的TRY CATCH发生例外,但在本TRY CATCH中无法捕获,传递给

上层TRY CATCH前被执行的。

在CLEARUP中到底做什么工作?

一般用来memroy释放等

从上面两点可能会联想到CLEARUP是否就是J***A中的final。Final是TRY CATCH

中异常发生与否都会被执行的,而CLEARUP只有在发生异常时执行的。所以光从这点就

可以判定CLEARUP与FINAL不是同一个东西了。



例:

parameters NUMBER type I.
data RESULT type P decimals 2.
data OREF type ref to CX_ROOT.
data TEXT type STRING.

start-of-selection.

write: / 'Testing divison and Sqare root with', NUMBER.
uline.
try.
if ABS( NUMBER ) > 100.
raise exception type CX_DEMO_ABS_TOO_LARGE.
endif.
try.
RESULT = 1 / NUMBER.
write: / 'Result of division:', RESULT.
RESULT = SQRT( NUMBER ).
write: / 'Result of square root:', RESULT.
catch CX_SY_ZERODIVIDE into OREF.
TEXT = OREF->GET_TEXT( ).
cleanup.
clear RESULT.
endtry.
catch CX_SY_ARITHMETIC_ERROR into OREF.
TEXT = OREF->GET_TEXT( ).
catch CX_ROOT into OREF.
TEXT = OREF->GET_TEXT( ).
endtry.
if not TEXT is initial.
write / TEXT.
endif.
write: / 'Final result:', RESULT.

例外的发生有两种情况:

。运行时例外,不能事前预测。如上例中的CX_SY_ZERODIVIDE等。

。用户自定义例外,可事前预测。如使用raise exception。

raise exception在这里有点像是J***A中的THROWS。当raise exception抛出异常时,

当前TRY CATCH代码块中,raise exception之后的命令将被强制终了,并且若异常被捕

捉的情况下,进行异常处理,若是不能被捕获,则交给上一层的TRY CATCH进行处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: