C จัดการข้อผิดพลาด
ภาษา C ไม่ได้ให้การสนับสนุนโดยตรงสำหรับการจัดการข้อผิดพลาด แต่เป็นภาษาโปรแกรมระบบก็จะส่งกลับค่าของรูปแบบที่ช่วยให้คุณสามารถเข้าถึงข้อมูลพื้นฐาน เมื่อเกิดข้อผิดพลาดส่วนใหญ่ของระบบปฏิบัติการยูนิกซ์หรือ C โทรฟังก์ชันส่งกลับ 1 หรือโมฆะรหัสข้อผิดพลาดก็จะตั้งerrno รหัสข้อผิดพลาดนี้เป็นตัวแปรทั่วโลกก็แสดงความผิดพลาดในระหว่างฟังก์ชั่นการโทรที่เกิดขึ้นคุณสามารถพบความหลากหลายของรหัสข้อผิดพลาด <error.h> ไฟล์ส่วนหัว
ดังนั้นโปรแกรมเมอร์ C สามารถกลับค่าโดยการตรวจสอบสิ่งที่ดำเนินการที่เหมาะสมแล้วจะตัดสินใจบนพื้นฐานของค่าตอบแทน นักพัฒนาควรเริ่มต้นที่โปรแกรม errno ตั้ง 0 ซึ่งเป็นวิธีการเขียนโปรแกรมที่ดี ค่า 0 บ่งชี้ว่าโปรแกรมที่ไม่มีข้อผิดพลาด
errno, pError () และ strerror ()
ภาษา C ให้pError () และ strerror ()ฟังก์ชันที่จะแสดงข้อความที่เกี่ยวข้องกับerrno
- pError () ฟังก์ชันที่จะแสดงผ่านของคุณสตริงตามลำไส้ใหญ่พื้นที่และการแสดงข้อความของมูลค่า errno ปัจจุบัน
- strerror () ฟังก์ชันกลับชี้ไปค่าปัจจุบันของการแสดงข้อความ errno
Let 's จำลองกรณีเท็จพยายามที่จะเปิดไฟล์ที่ไม่มีอยู่ คุณสามารถใช้หลายวิธีในการส่งออกข้อผิดพลาดที่นี่เราใช้ฟังก์ชั่นแสดงให้เห็นถึงการใช้งาน อีกสิ่งหนึ่งที่จะต้องทราบคุณควรใช้กระแส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, "错误号: %d\n", errno); perror("通过 perror 输出错误"); fprintf(stderr, "打开文件错误: %s\n", strerror( errnum )); } else { fclose (pf); } return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
错误号: 2 通过 perror 输出错误: No such file or directory 打开文件错误: No such file or directory
หารด้วยศูนย์ข้อผิดพลาด
ในช่วงหารหารเป็นศูนย์ถ้าไม่ได้รับการตรวจสอบจะมีผลในข้อผิดพลาด runtime
เพื่อป้องกันไม่ให้เกิดเหตุการณ์เช่นนี้รหัสต่อไปนี้ก่อนที่จะทำส่วนแรกจะตรวจสอบตัวหารเป็นศูนย์:
#include <stdio.h> #include <stdlib.h> main() { int dividend = 20; int divisor = 0; int quotient; if( divisor == 0){ fprintf(stderr, "除数为 0 退出运行...\n"); exit(-1); } quotient = dividend / divisor; fprintf(stderr, "quotient 变量的值为 : %d\n", quotient ); exit(0); }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
除数为 0 退出运行...
สถานะออกจากโปรแกรม
ภายใต้สถานการณ์ปกติการดำเนินงานที่ประสบความสำเร็จของโปรแกรมหลังจากระยะเวลาการดำเนินงานปกติจะออกมีมูลค่า 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, "除数为 0 退出运行...\n"); exit(EXIT_FAILURE); } quotient = dividend / divisor; fprintf(stderr, "quotient 变量的值为: %d\n", quotient ); exit(EXIT_SUCCESS); }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
quotient 变量的值为 : 4