Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

เรียนรู้การจัดการข้อผิดพลาด Try-Catch ในภาษา C: คู่มือปฏิบัติ

เรียนรู้การจัดการข้อผิดพลาด Try-Catch ในภาษา C: คู่มือปฏิบัติ

บทนำ

คำว่า "try" และ "catch" อธิบายถึงสิ่งที่ควรทำเมื่อโปรแกรมพบข้อยกเว้น (exception) เนื่องจากปัญหาโค้ดหรือข้อมูล ข้อยกเว้นจะถูกจัดการในบล็อก try ส่วนบล็อก catch ใช้สำหรับค้นหาและจัดการข้อยกเว้นจากบล็อก try ภาษาโปรแกรมมิ่งหลายภาษา เช่น Python, C++, และ JavaScript รองรับคำสั่ง try-catch แบบ built-in

บทความนี้สาธิตว่าคำสั่ง try-catch คืออะไร และวิธีการ implement ในภาษา C ผ่านตัวอย่าง

คำสั่ง Try-Catch คืออะไร?

คำสั่ง try กำหนดชุดคำสั่งที่อาจสร้างข้อยกเว้น เมื่อข้อยกเว้นประเภทเฉพาะเกิดขึ้น จะถูกส่งไปยังบล็อก catch หากบล็อก try/catch จัดการไม่ได้ คอมไพเลอร์จะแสดงข้อความผิดพลาด หรือข้อยกเว้นจะเลื่อนขึ้นไปใน call stack จนกว่าจะได้รับการจัดการ

ไวยากรณ์ทั่วไปของ try-catch:

try {
    /* ใส่โค้ดที่อาจสร้างข้อผิดพลาด */
}
catch {
    /* เขียนโค้ดจัดการข้อผิดพลาดที่เกิดขึ้น */
}

Try-Catch ในภาษา C

ภาษา C ไม่รองรับ Exception Handling แบบ built-in และไม่มีกลไกสำหรับทำเช่นนั้น อย่างไรก็ตาม สามารถจำลองได้บางส่วนด้วยการใช้ setjmp และ longjmp โดยไม่มีวิธีปล่อยหน่วยความจำเมื่อ stack ถูกเยี่ยมชม กลไกข้อยกเว้นจึงไม่มีประสิทธิภาพและไม่ปลอดภัย และ C ไม่มี Garbage Collector เพื่อปล่อย RAM เราอาจต้องรวม Context Managers ด้วย

เราจะสร้างโซลูชันทีละขั้นตอน โดยใช้ฟังก์ชัน longjmp และ setjmp จากไฟล์หัวข้อ setjmp.h ฟังก์ชัน setjmp รับตัวแปรแบบ jmp_buf และคืนค่า 0 เมื่อถูกเรียกโดยตรง เมื่อใช้ตัวแปร jmp_buf เดียวกันเรียก longjmp ด้วย 2 ตัวแปร setjmp จะคืนค่าที่ตรงกับอาร์กิวเมนต์ที่ 2 ของ longjmp

ตัวอย่างการ Implement Try-Catch ใน C

#include <stdio.h>
#include <setjmp.h>

#define TRY do { jmp_buf buf_state; if (!setjmp(buf_state)) {
#define CATCH } else {
#define ENDTRY }} while(0)
#define THROW longjmp(buf_state, 1)

int main() {
    TRY {
        printf("Try statement testing\n");
        THROW;
        printf("Statement should not appear, as the THROW block has already thrown the exception \n");
    }
    CATCH {
        printf("Got Exception \n");
    }
    ENDTRY;
    return 0;
}

ในโปรแกรม C ข้างต้น ฟังก์ชัน ENDTRY ใช้สำหรับปิดบล็อก do-while

เรียนรู้การจัดการข้อผิดพลาด Try-Catch ในภาษา C: คู่มือปฏิบัติ

คำอธิบายการทำงาน

  1. TRY - เริ่มบล็อก do-while ประกาศ jmp_buf และเรียก setjmp() ถ้าคืนค่า 0 (การเรียกครั้งแรก) จะรันโค้ดในบล็อก try
  2. THROW - เรียก longjmp() เพื่อกระโดดกลับไปที่ setjmp() ครั้งนี้ setjmp() จะคืนค่า 1 (จากอาร์กิวเมนต์ที่ 2 ของ longjmp)
  3. CATCH - เนื่องจาก setjmp() คืนค่าไม่ใช่ 0 โค้ดในบล็อก else (catch) จะทำงาน
  4. ENDTRY - ปิดบล็อก do-while

ข้อจำกัดของวิธีนี้

  • ไม่ใช่ Exception Handling จริงๆ มีเพียงการจำลองพฤติกรรม
  • ไม่มีการทำลายอ็อบเจกต์อัตโนมัติ (No RAII) ต้องจัดการทรัพยากรเอง
  • ไม่รองรับ nested try-catch ได้ดี (ต้องใช้ jmp_buf แยกกัน)
  • ไม่มี stack unwinding อาจทำให้รั่วหน่วยความจำ

ทางเลือกอื่นสำหรับการจัดการข้อผิดพลาดใน C

ในภาษา C แบบดั้งเดิม มักใช้วิธีต่อไปนี้แทน:

  1. Return codes - คืนค่ารหัสข้อผิดพลาดจากฟังก์ชัน
  2. errno - ตัวแปร global สำหรับรหัสข้อผิดพลาดระบบ
  3. setjmp/longjmp - สำหรับ non-local goto (เหมือนที่สาธิต)
  4. Custom error handling structures - สร้างโครงสร้างข้อผิดพลาดเอง

สรุป

หากโปรแกรมพบข้อยกเว็นเนื่องจากข้อผิดพลาดข้อมูลหรือโค้ดขณะรัน "try" และ "catch" อธิบายวิธีจัดการ ข้อยกเว้นเกิดในบล็อก try ส่วน catch เป็นที่ค้นหาและจัดการข้อผิดพลาดจาก try หลายภาษารองรับ try-catch แตภาษา C ไม่รองรับ บทความนี้อธิบายวิธีจำลอง try-catch ใน C ด้วย setjmp และ longjmp

เกี่ยวกับผู้เขียน

เรียนรู้การจัดการข้อผิดพลาด Try-Catch ในภาษา C: คู่มือปฏิบัติ

Komal Batool Batool

ฉันหลงใหลในการค้นคว้าเทคโนโลยีและแนวคิดใหม่ๆ ซึ่งนำมาซึ่งฉันมาที่นี่เพื่อเขียนให้ LinuxHint โฟกัสหลักคือเขียนเกี่ยวกับภาษาโปรแกรมมิ่งและหัวข้อวิทยาการคอมพิวเตอร์