0Pricing
C++ Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. try, catch, throw
  2. ความปลอดภัยของข้อยกเว้น
  3. ตัวระบุ noexcept
  4. ชนิดข้อยกเว้นแบบกำหนดเอง
← กลับไปที่ C++ Academy