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