SAP ABAP - Exception Handling التعامل مع الاستثناءات في ساب


SAP ABAP - Exception Handling التعامل مع الاستثناءات في ساب

SAP ABAP - Exception Handling التعامل مع الاستثناءات في ساب


SAP ABAP - Exception Handling التعامل مع الاستثناءات في ساب

و الاستثناء هو المشكلة التي تنشأ أثناء تنفيذ البرنامج. عند حدوث استثناء ، يتم تعطيل التدفق الطبيعي للبرنامج وينتهي تطبيق البرنامج بشكل غير طبيعي ، وهو أمر غير موصى به ، لذلك يجب التعامل مع هذه الاستثناءات.

توفر الاستثناءات طريقة لنقل التحكم من جزء من برنامج إلى آخر. تم بناء معالجة استثناء 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 إلى اصطياد استثناء.

CLEANUP - يتم تنفيذ عبارات كتلة CLEANUP عند حدوث استثناء في كتلة TRY لم يتم اكتشافها بواسطة معالج نفس بنية TRY - ENDTRY. ضمن بند CLEANUP ، يمكن للنظام استعادة كائن إلى حالة متسقة أو تحرير موارد خارجية. أي أنه يمكن تنفيذ أعمال التنظيف لسياق كتلة TRY.

رفع الاستثناءات

يمكن رفع الاستثناءات في أي نقطة في طريقة ، أو وحدة دالة ، أو روتين فرعي ، وما إلى ذلك. هناك طريقتان يمكن رفع الاستثناء -

  • أثار نظام وقت تشغيل ABAP الاستثناءات.

    على سبيل المثال Y = 1 / 0. سيؤدي هذا إلى حدوث خطأ وقت التشغيل من النوع CX_SY_ZERODIVIDE.

  • الاستثناءات التي أثارها المبرمج.

    رفع وإنشاء كائن استثناء في وقت واحد. رفع استثناء مع كائن استثناء موجود بالفعل في السيناريو الأول. الصيغة هي: استثناء RAISE 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 = exrefGET_TEXT( ). 

CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref. 
msgtxt = exrefGET_TEXT( ).

في مقتطف الشفرة أعلاه ، نحاول قسمة Num1 على Num2 للحصول على النتيجة في متغير من النوع العائم.

يمكن إنشاء نوعين من الاستثناءات.

  • خطأ في تحويل الرقم.

  • اقسم على صفر استثناء. تلتقط المعالجات استثناء 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_1GET_TEXT( ). 
CLEANUP. 
CLEAR res_1. 
ENDTRY. 

CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1. 
txt_1 = orf_1GET_TEXT( ).

CATCH CX_ROOT INTO orf_1. 
txt_1 = orf_1GET_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