W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
異常是在程序執(zhí)行期間出現(xiàn)的問(wèn)題。 當(dāng)異常發(fā)生時(shí),程序的正常流程中斷,程序應(yīng)用程序異常終止,這是不推薦的,因此這些異常將被處理。
異常提供了一種將控制從程序的一個(gè)部分轉(zhuǎn)移到另一個(gè)部分的方法。 ABAP異常處理建立在三個(gè)關(guān)鍵字 - RAISE,TRY,CATCH和CLEANUP。 假設(shè)塊將引發(fā)異常,則方法使用TRY和CATCH關(guān)鍵字的組合捕獲異常。 TRY - CATCH塊放置在可能生成異常的代碼周圍。 以下是使用TRY - CATCH的語(yǔ)法:
TRY. Try Block <Code that raises an exception> CATCH Catch Block <exception handler M> . . . . . . . . . CATCH Catch Block <exception handler R> CLEANUP. Cleanup block <to restore consistent state> ENDTRY.
RAISE - 提出異常,表示發(fā)生了一些異常情況。 通常,異常處理程序會(huì)嘗試修復(fù)錯(cuò)誤或找到替代解決方案。
TRY - TRY塊包含要處理其異常的應(yīng)用程序編碼。 此語(yǔ)句塊按順序處理。 它可以包含進(jìn)一步的控制結(jié)構(gòu)和程序調(diào)用或其他ABAP程序。 它后面是一個(gè)或多個(gè)catch塊。
CATCH - 程序在要處理問(wèn)題的程序中的地方使用異常處理程序捕獲異常。 CATCH關(guān)鍵字表示捕獲異常。
CLEANUP - 每當(dāng)在TRY塊中發(fā)生異常,而TRY塊未被同一TRY - ENDTRY結(jié)構(gòu)的處理程序捕獲時(shí),將執(zhí)行CLEANUP塊的語(yǔ)句。 在CLEANUP子句中,系統(tǒng)可以將對(duì)象恢復(fù)到一致?tīng)顟B(tài)或釋放外部資源。 也就是說(shuō),可以對(duì)TRY塊的上下文執(zhí)行清除工作。
可以在方法中的任何點(diǎn),函數(shù)模塊,子例程等提出異常。 有兩種方式可以引發(fā)異常:
ABAP運(yùn)行時(shí)系統(tǒng)引發(fā)的異常。
例如,Y = 1 / 0.這將導(dǎo)致類型CX_SY_ZERODIVIDE的運(yùn)行時(shí)錯(cuò)誤。
程序員提出的異常。
同時(shí)提升和創(chuàng)建異常對(duì)象。 使用第一個(gè)方案中已存在的異常對(duì)象來(lái)引發(fā)異常。 語(yǔ)法是:RAISE EXCEPTION exep。
處理程序用于捕獲異常。
讓我們來(lái)看看一段代碼片段:
DATA: result TYPE P LENGTH 8 DECIMALS 2, exref TYPE REF TO CX_ROOT, msgtxt TYPE STRING. PARAMETERS: Num1 TYPE I, Num2 TYPE I. TRY. result = Num1 / Num2. CATCH CX_SY_ZERODIVIDE INTO exref. msgtxt = exref→GET_TEXT( ). CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref. msgtxt = exref→GET_TEXT( ).
在上面的代碼片段中,我們?cè)噲D將Num1除以Num2,得到一個(gè)float類型變量的結(jié)果。
可以生成兩種類型的異常。
數(shù)字轉(zhuǎn)換錯(cuò)誤。
除以零異常。 處理程序捕獲CX_SY_CONVERSION_NO_NUMBER異常以及CX_SY_ZERODIVIDE異常。 這里異常類的GET_TEXT()方法用于獲取異常的描述。
這里是異常的五個(gè)屬性和方法:
編號(hào) | 屬性和說(shuō)明 |
---|---|
1 | Textid 用于定義異常的不同文本,并且也影響方法get_text的結(jié)果。 |
2 | Previous 此屬性可以存儲(chǔ)原始異常,允許您構(gòu)建異常鏈。 |
3 | get_text 這將根據(jù)異常的系統(tǒng)語(yǔ)言將文本表示作為字符串返回。 |
4 | get_longtext 這會(huì)將異常的文本表示的長(zhǎng)變體作為字符串返回。 |
5 | get_source_position 給出引發(fā)異常的程序名和行號(hào)。 |
REPORT ZExceptionsDemo. PARAMETERS Num_1 TYPE I. DATA res_1 TYPE P DECIMALS 2. DATA orf_1 TYPE REF TO CX_ROOT. DATA txt_1 TYPE STRING. start-of-selection. Write: / 'Square Root and Division with:', Num_1. write: /. TRY. IF ABS( Num_1 ) > 150. RAISE EXCEPTION TYPE CX_DEMO_ABS_TOO_LARGE. ENDIF. TRY. res_1 = SQRT( Num_1 ). Write: / 'Result of square root:', res_1. res_1 = 1 / Num_1. Write: / 'Result of division:', res_1. CATCH CX_SY_ZERODIVIDE INTO orf_1. txt_1 = orf_1→GET_TEXT( ). CLEANUP. CLEAR res_1. ENDTRY. CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1. txt_1 = orf_1→GET_TEXT( ). CATCH CX_ROOT INTO orf_1. txt_1 = orf_1→GET_TEXT( ). ENDTRY. IF NOT txt_1 IS INITIAL. Write / txt_1. ENDIF. Write: / 'Final Result is:', res_1.
在此示例中,如果數(shù)字大于150,則引發(fā)異常CX_DEMO_ABS_TOO_LARGE。 上面的代碼為數(shù)字160生成以下輸出。
Square Root and Division with: 160 The absolute value of number is too high Final Result is: 0.00
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: