ABAP基礎知識學習(一)
●巨集定義(macro)
DEFINE~END-OF-DEFINITION
相同命令體2次以上執行的時候,可以使用巨集定義來實現。
巨集定義必須在巨集呼叫之前,巨集定義中最多可使用9個佔位符(相當於變數名),&1~&9。
巨集定義在程式執行時不能使用斷點除錯,因此,應儘量使巨集定義簡單明瞭,或是儘可能的用函式等替代。
DATA: result TYPE i,
n1TYPE i VALUE 5,
n2TYPE 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的命令與JAVA中的非常相似,這裡不再多做解釋。
重點介紹一下關鍵字CLEANUP。
首先,CLEARUP是在什麼時候被執行的?
CLEARUP是在所在的TRY CATCH發生例外,但在本TRY CATCH中無法捕獲,傳遞給
上層TRY CATCH前被執行的。
在CLEARUP中到底做什麼工作?
一般用來memroy釋放等
從上面兩點可能會聯想到CLEARUP是否就是JAVA中的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在這裡有點像是JAVA中的THROWS。當raise exception丟擲異常時,
當前TRY CATCH程式碼塊中,raise exception之後的命令將被強制終了,並且若異常被捕
捉的情況下,進行異常處理,若是不能被捕獲,則交給上一層的TRY CATCH進行處理。