SAP ABAP - การจัดการข้อยกเว้น

อัน exceptionเป็นปัญหาที่เกิดขึ้นระหว่างการทำงานของโปรแกรม เมื่อมีข้อยกเว้นเกิดขึ้นโฟลว์ปกติของโปรแกรมจะหยุดชะงักและแอปพลิเคชันโปรแกรมหยุดทำงานอย่างผิดปกติซึ่งไม่แนะนำดังนั้นจึงต้องจัดการข้อยกเว้นเหล่านี้

ข้อยกเว้นเป็นวิธีการถ่ายโอนการควบคุมจากส่วนหนึ่งของโปรแกรมไปยังอีกส่วนหนึ่ง การจัดการข้อยกเว้น ABAP สร้างขึ้นจากคำหลักสามคำ - RAISE, TRY, CATCH และ CLEANUP สมมติว่าบล็อกจะทำให้เกิดข้อยกเว้นเมธอดจะจับข้อยกเว้นโดยใช้คีย์เวิร์ด TRY และ CATCH ร่วมกัน TRY - CATCH block วางอยู่รอบ ๆ โค้ดที่อาจสร้างข้อยกเว้น ต่อไปนี้เป็นไวยากรณ์สำหรับการใช้ 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 บ่งบอกถึงการจับข้อยกเว้น

CLEANUP- คำสั่งของบล็อก CLEANUP จะดำเนินการเมื่อใดก็ตามที่มีข้อยกเว้นเกิดขึ้นในบล็อก TRY ที่ไม่ได้ถูกจับโดยตัวจัดการของโครงสร้าง TRY - ENDTRY เดียวกัน ภายในส่วนคำสั่ง CLEANUP ระบบสามารถกู้คืนอ็อบเจ็กต์ให้อยู่ในสถานะที่สอดคล้องกันหรือปล่อยรีซอร์สภายนอก นั่นคืองานล้างข้อมูลสามารถดำเนินการได้สำหรับบริบทของบล็อก TRY

การเพิ่มข้อยกเว้น

สามารถยกข้อยกเว้น ณ จุดใดก็ได้ในเมธอดโมดูลฟังก์ชันรูทีนย่อยและอื่น ๆ มีสองวิธีในการเพิ่มข้อยกเว้น -

  • ข้อยกเว้นที่เพิ่มขึ้นโดยระบบรันไทม์ ABAP

    ตัวอย่างเช่น Y = 1/0 สิ่งนี้จะส่งผลให้เกิดข้อผิดพลาดรันไทม์ประเภท CX_SY_ZERODIVIDE

  • ข้อยกเว้นที่เพิ่มขึ้นโดยโปรแกรมเมอร์

    เพิ่มและสร้างวัตถุข้อยกเว้นพร้อมกัน เพิ่มข้อยกเว้นด้วยอ็อบเจ็กต์ข้อยกเว้นที่มีอยู่แล้วในสถานการณ์แรก ไวยากรณ์คือ: RAISE EXCEPTION exep

การจับข้อยกเว้น

Handlers ใช้เพื่อจับข้อยกเว้น

มาดูข้อมูลโค้ด -

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