القائمة الرئيسية

الصفحات

C - Error Handling / معالجة الخطأ

 على هذا النحو ، لا توفر برمجة C دعمًا مباشرًا لمعالجة الأخطاء ولكنها لغة برمجة نظام ، فهي توفر لك الوصول على مستوى أدنى في شكل قيم إرجاع. معظم استدعاءات دالة C أو حتى Unix ترجع -1 أو NULL في حالة حدوث أي خطأ وتعيين رمز خطأ errno . يتم تعيينه كمتغير عام ويشير إلى حدوث خطأ أثناء أي استدعاء للدالة. يمكنك العثور على العديد من رموز الأخطاء المحددة في ملف الرأس <error.h>.

لذلك يمكن للمبرمج C التحقق من القيم التي تم إرجاعها ويمكنه اتخاذ الإجراء المناسب بناءً على قيمة الإرجاع. من الممارسات الجيدة تعيين errno على 0 في وقت تهيئة البرنامج. تشير القيمة 0 إلى عدم وجود خطأ في البرنامج.

errno ، perror (). و strerror ()

توفر لغة البرمجة C وظائف perror () و strerror () والتي يمكن استخدامها لعرض الرسالة النصية المرتبطة بالخطأ .

  • و perror () يعرض وظيفة السلسلة التي تمرر إلى ذلك، متبوعا بنقطتين، مسافة، ومن ثم تمثيل نصية من قيمة errno الحالية.

  • و strerror () وظيفة، والتي ترجع مؤشر إلى تمثيل نصية من قيمة errno الحالية.

دعنا نحاول محاكاة حالة خطأ ونحاول فتح ملف غير موجود. أنا هنا أستخدم كلتا الوظيفتين لإظهار الاستخدام ، ولكن يمكنك استخدام طريقة واحدة أو أكثر لطباعة أخطائك. النقطة الثانية المهمة التي يجب ملاحظتها هي أنه يجب عليك استخدام دفق ملف stderr لإخراج جميع الأخطاء.

#include <stdio.h>
#include <errno.h>
#include <string.h>

extern int errno ;

int main () {

   FILE * pf;
   int errnum;
   pf = fopen ("unexist.txt", "rb");
	
   if (pf == NULL) {
   
      errnum = errno;
      fprintf(stderr, "Value of errno: %d\n", errno);
      perror("Error printed by perror");
      fprintf(stderr, "Error opening file: %s\n", strerror( errnum ));
   } else {
   
      fclose (pf);
   }
   
   return 0;
}

عندما يتم تجميع التعليمات البرمجية أعلاه وتنفيذها ، فإنها تنتج النتيجة التالية -

Value of errno: 2
Error printed by perror: No such file or directory
Error opening file: No such file or directory

قسمة على صفر أخطاء

إنها مشكلة شائعة أنه في وقت قسمة أي رقم ، لا يتحقق المبرمجون مما إذا كان المقسوم عليه صفرًا ، وفي النهاية ينتج عنه خطأ في وقت التشغيل.

يُصلح الكود أدناه هذا عن طريق التحقق مما إذا كان المقسوم عليه صفرًا قبل القسمة -


#include <stdio.h>
#include <stdlib.h>

main() {

   int dividend = 20;
   int divisor = 0;
   int quotient;
 
   if( divisor == 0){
      fprintf(stderr, "Division by zero! Exiting...\n");
      exit(-1);
   }
   
   quotient = dividend / divisor;
   fprintf(stderr, "Value of quotient : %d\n", quotient );

   exit(0);
}

عندما يتم تجميع التعليمات البرمجية أعلاه وتنفيذها ، فإنها تنتج النتيجة التالية -

Division by zero! Exiting...

حالة الخروج من البرنامج

إنها ممارسة شائعة للخروج بقيمة EXIT_SUCCESS في حالة خروج البرنامج بعد عملية ناجحة. هنا ، EXIT_SUCCESS هو ماكرو ويتم تعريفه على أنه 0.

إذا كانت لديك حالة خطأ في برنامجك وكنت على وشك الخروج ، فيجب عليك الخروج بالحالة EXIT_FAILURE والتي تم تعريفها على أنها -1. لذلك دعونا نكتب البرنامج أعلاه على النحو التالي -


#include <stdio.h>
#include <stdlib.h>

main() {

   int dividend = 20;
   int divisor = 5;
   int quotient;
 
   if( divisor == 0) {
      fprintf(stderr, "Division by zero! Exiting...\n");
      exit(EXIT_FAILURE);
   }
	
   quotient = dividend / divisor;
   fprintf(stderr, "Value of quotient : %d\n", quotient );

   exit(EXIT_SUCCESS);
}

عندما يتم تجميع التعليمات البرمجية أعلاه وتنفيذها ، فإنها تنتج النتيجة التالية -

Value of quotient : 4

الصفحة التالية                                                                                   الصفحة السابقة  
هل اعجبك الموضوع :

تعليقات