try, catch, throw
จัดการข้อผิดพลาดด้วยข้อยกเว้น
try, catch, throw เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
การส่งสัญญาณข้อผิดพลาดด้วยการโยน
คำสั่ง throw จะทำให้เกิด ข้อยกเว้น ยกเลิกเส้นทางการทำงานปัจจุบัน แล้วค้นหาตัวจัดการย้อนขึ้นไปตามสแตกการเรียก
#include <iostream>
#include <stdexcept>
int main() {
try {
throw std::runtime_error("boom");
} catch (const std::exception& e) {
std::cout << e.what() << "\n";
}
}การลองและการดักจับ
โค้ดที่อาจทำให้เกิดข้อยกเว้นต้องอยู่ในบล็อก try และตัวจัดการที่ตรงกันจะตามมาในบล็อก catch
#include <iostream>
#include <stdexcept>
int divide(int a, int b) {
if (b == 0) throw std::invalid_argument("divide by zero");
return a / b;
}
int main() {
try {
std::cout << divide(10, 0) << "\n";
} catch (const std::invalid_argument& e) {
std::cout << "error: " << e.what() << "\n";
}
}จับด้วยการอ้างอิงแบบคงที่
ควรจับข้อยกเว้นด้วย const& เสมอ การจับด้วยค่าจะตัดส่วนของข้อยกเว้นที่สืบทอดมา และทำให้เกิดการคัดลอกโดยไม่จำเป็น
บล็อกดักจับหลายบล็อก
เรียงตัวจัดการจากเฉพาะเจาะจงที่สุดไปทั่วไปที่สุด บล็อกแรกที่ตรงกันจะทำงาน
#include <iostream>
#include <stdexcept>
int main() {
try {
throw std::out_of_range("bad index");
} catch (const std::out_of_range& e) {
std::cout << "range: " << e.what() << "\n";
} catch (const std::exception& e) {
std::cout << "other: " << e.what() << "\n";
}
}การคลายสแตก
เมื่อมีการโยนข้อยกเว้น สแตกจะ คลายตัว: อ็อบเจ็กต์ภายในทั้งหมดระหว่างจุดโยนกับตัวจัดการจะถูกทำลายตามลำดับย้อนกลับ
#include <iostream>
#include <stdexcept>
struct Trace {
~Trace() { std::cout << "unwound\n"; }
};
void f() {
Trace t;
throw std::runtime_error("x");
}
int main() {
try { f(); } catch (...) { std::cout << "caught\n"; }
}ตัวจัดการที่จับได้ทุกกรณี
บล็อก catch (...) จะจับข้อยกเว้นได้ทุกชนิด ควรใช้อย่างจำกัด โดยทั่วไปใช้เพื่อบันทึกข้อผิดพลาดแล้วโยนข้อยกเว้นต่อ
การโยนข้อยกเว้นต่อ
ภายในตัวจัดการ คำสั่ง throw; ที่ไม่มีอาร์กิวเมนต์จะโยนข้อยกเว้นปัจจุบันต่อ โดยคงชนิดของข้อยกเว้นไว้ เพื่อให้ตัวจัดการภายนอกจัดการต่อได้
#include <iostream>
#include <stdexcept>
void inner() { throw std::runtime_error("deep"); }
void middle() {
try { inner(); }
catch (...) { std::cout << "logged\n"; throw; } // rethrow
}
int main() {
try { middle(); } catch (const std::exception& e) { std::cout << e.what() << "\n"; }
}ลำดับชั้นข้อยกเว้นมาตรฐาน
ข้อยกเว้นมาตรฐานส่วนใหญ่สืบทอดจาก std::exception ซึ่งมี what() ให้ใช้ การจับ std::exception จะจัดการข้อยกเว้นเหล่านี้ได้ทั้งหมด
โยนด้วยค่า จับด้วยการอ้างอิง
โยนอ็อบเจ็กต์ข้อยกเว้นชั่วคราวด้วยค่า ระบบขณะทำงานจะคัดลอกอ็อบเจ็กต์เหล่านั้นไปยังพื้นที่ที่ปลอดภัย จับด้วยการอ้างอิงเพื่อหลีกเลี่ยงการตัดส่วน
ข้อยกเว้นเทียบกับรหัสข้อผิดพลาด
ข้อยกเว้นแยกเส้นทางข้อผิดพลาดออกจากเส้นทางการทำงานปกติ และไม่สามารถถูกละเลยโดยไม่ตั้งใจได้เหมือนรหัสส่งคืน ควรสงวนข้อยกเว้นไว้สำหรับสถานการณ์ผิดปกติอย่างแท้จริง
ข้อยกเว้นที่ไม่มีตัวจัดการจะยุติโปรแกรม
หากไม่มีตัวจัดการใดตรงกัน ระบบจะเรียก std::terminate และโปรแกรมจะยุติการทำงาน ควรจัดการข้อยกเว้นที่คุณคาดว่าจะเกิดขึ้นเสมอ
ตรวจสอบความเข้าใจสั้น ๆ
ทดสอบความเข้าใจของคุณเกี่ยวกับการจัดการข้อยกเว้น
สรุป
คุณได้เรียนรู้การทำให้เกิดข้อผิดพลาดด้วย throw การจัดการด้วย try/catch และวิธีที่ การคลายสแตก ทำลายตัวแปรภายในระหว่างทาง จับด้วย const& เรียงตัวจัดการจากเฉพาะเจาะจงไปทั่วไป และโยนข้อยกเว้นต่อด้วย throw; ที่ไม่มีอาร์กิวเมนต์
คำถามที่พบบ่อย
บทเรียน “try, catch, throw” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “try, catch, throw” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “try, catch, throw”
จัดการข้อผิดพลาดด้วยข้อยกเว้น คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “try, catch, throw” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- try, catch, throw
- ความปลอดภัยของข้อยกเว้น
- ตัวระบุ noexcept
- ชนิดข้อยกเว้นแบบกำหนดเอง