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—รวมถึงการปฏิบัติที่ดีที่สุดสมัยใหม่เช่นไลบรารีการจัดการข้อผิดพลาดและข้อตกลง—มั่นใจในความแข็งแกร่งและความน่าเชื่อถือ