SAP ABAP 異常處理

2018-12-30 09:37 更新

異常是在程序執(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
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)