Error Handling การจัดการข้อผิดพลาด ภาษา C

ด้วยเหตุนี้ การเขียนโปรแกรม C จึงไม่ได้ให้การสนับสนุนโดยตรงสำหรับการจัดการข้อผิดพลาด แต่เป็นภาษาการเขียนโปรแกรมของระบบ ช่วยให้คุณเข้าถึงในระดับที่ต่ำกว่าในรูปแบบของค่าที่ส่งกลับ ส่วนใหญ่ของ C หรือแม้แต่ระบบปฏิบัติการยูนิกซ์ฟังก์ชั่นการโทรกลับ -1 หรือ NULL ในกรณีของข้อผิดพลาดใด ๆ และการตั้งค่ารหัสข้อผิดพลาด errno มันถูกตั้งค่าเป็นตัวแปรส่วนกลางและบ่งชี้ว่ามีข้อผิดพลาดเกิดขึ้นระหว่างการเรียกใช้ฟังก์ชันใดๆ คุณสามารถค้นหารหัสข้อผิดพลาดต่างๆ ที่กำหนดไว้ในไฟล์ส่วนหัว <error.h>

ดังนั้นโปรแกรมเมอร์ภาษาซีจึงสามารถตรวจสอบค่าที่ส่งคืนและดำเนินการตามความเหมาะสมได้ขึ้นอยู่กับมูลค่าที่ส่งคืน เป็นแนวปฏิบัติที่ดีในการตั้งค่า errno เป็น 0 ในขณะที่เริ่มต้นโปรแกรม ค่า 0 แสดงว่าไม่มีข้อผิดพลาดในโปรแกรม

errno, perror(). and strerror()


การเขียนโปรแกรมภาษา C ให้ pError ()และ strerror () ฟังก์ชั่นที่สามารถใช้ในการแสดงข้อความที่เกี่ยวข้องกับการ errno

  • 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


Divide by Zero Errors


เป็นปัญหาทั่วไปที่ในขณะที่ทำการหารตัวเลขใดๆ โปรแกรมเมอร์ไม่ตรวจสอบว่าตัวหารเป็นศูนย์หรือไม่ และในที่สุดก็สร้างข้อผิดพลาดรันไทม์

รหัสด้านล่างแก้ไขโดยตรวจสอบว่าตัวหารเป็นศูนย์ก่อนหาร −

#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...


Program Exit Status


เป็นเรื่องปกติที่จะออกด้วยค่า 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

Leave a Reply

Your email address will not be published. Required fields are marked *