SAP ABAP 异常处理
異常是在程序執行期間出現的問題。?當異常發生時,程序的正常流程中斷,程序應用程序異常終止,這是不推薦的,因此這些異常將被處理。
異常提供了一種將控制從程序的一個部分轉移到另一個部分的方法。?ABAP異常處理建立在三個關鍵字 - RAISE,TRY,CATCH和CLEANUP。?假設塊將引發異常,則方法使用TRY和CATCH關鍵字的組合捕獲異常。?TRY - CATCH塊放置在可能生成異常的代碼周圍。?以下是使用TRY - CATCH的語法:
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?- 提出異常,表示發生了一些異常情況。?通常,異常處理程序會嘗試修復錯誤或找到替代解決方案。
TRY?- TRY塊包含要處理其異常的應用程序編碼。?此語句塊按順序處理。?它可以包含進一步的控制結構和程序調用或其他ABAP程序。?它后面是一個或多個catch塊。
CATCH?- 程序在要處理問題的程序中的地方使用異常處理程序捕獲異常。?CATCH關鍵字表示捕獲異常。
CLEANUP?- 每當在TRY塊中發生異常,而TRY塊未被同一TRY - ENDTRY結構的處理程序捕獲時,將執行CLEANUP塊的語句。?在CLEANUP子句中,系統可以將對象恢復到一致狀態或釋放外部資源。?也就是說,可以對TRY塊的上下文執行清除工作。
提出異常
可以在方法中的任何點,函數模塊,子例程等提出異常。?有兩種方式可以引發異常:
-
ABAP運行時系統引發的異常。
例如,Y = 1 / 0.這將導致類型CX_SY_ZERODIVIDE的運行時錯誤。
-
程序員提出的異常。
同時提升和創建異常對象。?使用第一個方案中已存在的異常對象來引發異常。?語法是:RAISE EXCEPTION exep。
捕捉異常
處理程序用于捕獲異常。
讓我們來看看一段代碼片段:
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( ).在上面的代碼片段中,我們試圖將Num1除以Num2,得到一個float類型變量的結果。
可以生成兩種類型的異常。
-
數字轉換錯誤。
-
除以零異常。?處理程序捕獲CX_SY_CONVERSION_NO_NUMBER異常以及CX_SY_ZERODIVIDE異常。?這里異常類的GET_TEXT()方法用于獲取異常的描述。
異常的屬性
這里是異常的五個屬性和方法:
| 1 | Textid 用于定義異常的不同文本,并且也影響方法get_text的結果。 |
| 2 | Previous 此屬性可以存儲原始異常,允許您構建異常鏈。 |
| 3 | get_text 這將根據異常的系統語言將文本表示作為字符串返回。 |
| 4 | get_longtext 這會將異常的文本表示的長變體作為字符串返回。 |
| 5 | get_source_position 給出引發異常的程序名和行號。 |
例子
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.在此示例中,如果數字大于150,則引發異常CX_DEMO_ABS_TOO_LARGE。?上面的代碼為數字160生成以下輸出。
Square Root and Division with: 160 The absolute value of number is too high Final Result is: 0.00總結
以上是生活随笔為你收集整理的SAP ABAP 异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Power Query 应用领域有哪些?
- 下一篇: SAP激活物料分类帐