
บทนำ
คำว่า "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 - เริ่มบล็อก do-while ประกาศ jmp_buf และเรียก setjmp() ถ้าคืนค่า 0 (การเรียกครั้งแรก) จะรันโค้ดในบล็อก try
- THROW - เรียก longjmp() เพื่อกระโดดกลับไปที่ setjmp() ครั้งนี้ setjmp() จะคืนค่า 1 (จากอาร์กิวเมนต์ที่ 2 ของ longjmp)
- CATCH - เนื่องจาก setjmp() คืนค่าไม่ใช่ 0 โค้ดในบล็อก else (catch) จะทำงาน
- ENDTRY - ปิดบล็อก do-while
ข้อจำกัดของวิธีนี้
- ไม่ใช่ Exception Handling จริงๆ มีเพียงการจำลองพฤติกรรม
- ไม่มีการทำลายอ็อบเจกต์อัตโนมัติ (No RAII) ต้องจัดการทรัพยากรเอง
- ไม่รองรับ nested try-catch ได้ดี (ต้องใช้ jmp_buf แยกกัน)
- ไม่มี stack unwinding อาจทำให้รั่วหน่วยความจำ
ทางเลือกอื่นสำหรับการจัดการข้อผิดพลาดใน C
ในภาษา C แบบดั้งเดิม มักใช้วิธีต่อไปนี้แทน:
- Return codes - คืนค่ารหัสข้อผิดพลาดจากฟังก์ชัน
- errno - ตัวแปร global สำหรับรหัสข้อผิดพลาดระบบ
- setjmp/longjmp - สำหรับ non-local goto (เหมือนที่สาธิต)
- Custom error handling structures - สร้างโครงสร้างข้อผิดพลาดเอง
สรุป
หากโปรแกรมพบข้อยกเว็นเนื่องจากข้อผิดพลาดข้อมูลหรือโค้ดขณะรัน "try" และ "catch" อธิบายวิธีจัดการ ข้อยกเว้นเกิดในบล็อก try ส่วน catch เป็นที่ค้นหาและจัดการข้อผิดพลาดจาก try หลายภาษารองรับ try-catch แตภาษา C ไม่รองรับ บทความนี้อธิบายวิธีจำลอง try-catch ใน C ด้วย setjmp และ longjmp
เกี่ยวกับผู้เขียน

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