C:
การจัดการกับข้อผิดพลาด
วิธีการ:
C ไม่มีการสนับสนุนโดยตรงสำหรับการจัดการข้อผิดพลาดแบบที่มีในบางภาษาอื่น แต่ใช้วิธีการจัดการข้อผิดพลาดแบบดั้งเดิม อย่างเช่น การส่งค่าพิเศษกลับจากฟังก์ชัน และการตั้งค่าตัวแปรทั่วโลก เช่น errno
การส่งค่าพิเศษกลับ
ฟังก์ชั่นสามารถแจ้งข้อผิดพลาดโดยการส่งค่าพิเศษที่ไม่น่าจะเป็นผลลัพธ์ที่ถูกต้อง ตัวอย่างต่อไปนี้เป็นการใช้งานกับจำนวนเต็ม:
#include <stdio.h>
int inverse(int number, double *result) {
if (number == 0) {
return -1; // กรณีข้อผิดพลาด
} else {
*result = 1.0 / number;
return 0; // สำเร็จ
}
}
int main() {
double result;
if (inverse(0, &result) < 0) {
printf("Error: Division by zero.\n");
} else {
printf("The inverse is: %f\n", result);
}
return 0;
}
ผลลัพธ์:
Error: Division by zero.
การตรวจสอบ errno
สำหรับฟังก์ชันในไลบรารี โดยเฉพาะอย่างยิ่งที่มีการโต้ตอบกับระบบหรือ OS (เช่น การ I/O ไฟล์) errno
จะถูกตั้งค่าเมื่อเกิดข้อผิดพลาด ในการใช้งาน ให้รวมไฟล์ errno.h
และตรวจสอบ errno
หลังจากที่สงสัยว่ามีความล้มเหลว:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("nonexistent.txt", "r");
if (file == NULL) {
printf("Error opening file: %s\n", strerror(errno));
}
return 0;
}
ผลลัพธ์:
Error opening file: No such file or directory
ลงลึก
โดยประวัติศาสตร์แล้ว การออกแบบที่เรียบง่ายของภาษา C ไม่รวมถึงกลไกการจัดการข้อผิดพลาดภายในตัว ซึ่งสะท้อนถึงต้นกำเนิดของการเขียนโปรแกรมระดับระบบที่ประสิทธิภาพสูงสุดและการควบคุมที่ใกล้เคียงกับระดับฮาร์ดแวร์มีความสำคัญ แทนที่จะใช้วิธีการจัดการข้อผิดพลาดที่ต้องทำด้วยตนเองซึ่งเข้ากับปรัชญาของการให้อิสระกับโปรแกรมเมอร์มากที่สุด แม้ว่าจะต้องแลกมาด้วยความสะดวก
ในขณะที่วิธีนี้เข้ากันได้ดีกับเป้าหมายการออกแบบของ C แต่ก็อาจนำไปสู่รหัสการตรวจสอบข้อผิดพลาดที่มากเกินไปและมีโอกาสพลาดการตรวจสอบข้อผิดพลาด ซึ่งภาษาสมัยใหม่ได้มีการจัดการด้วยกลไกการจัดการข้อผิดพลาดแบบมีโครงสร้าง ตัวอย่างเช่น เลขานุการในภาษาเช่น Java หรือ C# ช่วยให้การประมวลผลข้อผิดพลาดเป็นศูนย์กลาง ทำให้รหัสสะอาดขึ้นและการจัดการข้อผิดพลาดง่ายขึ้น อย่างไรก็ตาม เลขานุการเหล่านี้นำมาซึ่งภาระและความซับซ้อนของตนเอง ซึ่งอาจไม่เหมาะสมสำหรับการเขียนโปรแกรมระดับระบบที่ C โดดเด่น
แม้จะมีความรุนแรงนี้ การจัดการข้อผิดพลาดแบบด้วยตนเองใน C ได้แนะนำการออกแบบการจัดการข้อผิดพลาดในภาษาอื่นๆ มากมาย โดยเสนอรูปแบบที่ความชัดเจนของเงื่อนไขข้อผิดพลาดสามารถนำไปสู่รหัสที่สามารถคาดการณ์และแก้ไขได้ง่ายขึ้น สำหรับระบบที่สำคัญ ที่ต้องการการจัดการความล้มเหลวอย่างมีน้ำหนัก รูปแบบการจัดการข้อผิดพลาดของ C—รวมถึงการปฏิบัติที่ดีที่สุดสมัยใหม่เช่นไลบรารีการจัดการข้อผิดพลาดและข้อตกลง—มั่นใจในความแข็งแกร่งและความน่าเชื่อถือ