1. 程式人生 > >ABAP基礎知識學習(一)

ABAP基礎知識學習(一)

巨集定義(macro

DEFINEEND-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.

例外處理

Ø61版本之前

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]

Ø61版本之後

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中的finalFinalTRY CATCH

中異常發生與否都會被執行的,而CLEARUP只有在發生異常時執行的。所以光從這點就

可以判定CLEARUPFINAL不是同一個東西了。

:

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進行處理。