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