C++:
การจัดการกับข้อผิดพลาด

วิธีการ:

นี่คือบล็อก try-catch พื้นฐานเพื่อจัดการกับข้อยกเว้น:

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::runtime_error("อุ๊ปส์! เกิดข้อผิดพลาดบางอย่าง.");
    } catch (const std::exception& e) {
        std::cerr << "ข้อผิดพลาด: " << e.what() << std::endl;
    }
    return 0;
}

ตัวอย่างผลลัพธ์:

ข้อผิดพลาด: อุ๊ปส์! เกิดข้อผิดพลาดบางอย่าง.

ลงลึก

C++ มีการจัดการข้อผิดพลาดมาตั้งแต่ในวันแรกๆ รูปแบบที่พื้นฐานที่สุดคือการตรวจสอบค่าที่กลับมา ถ้าคุณมีประสบการณ์หลายบล็อก, คุณจะจำวันที่ยังไม่มีมาตรฐาน: C ที่มีคลาสและการตรวจสอบข้อผิดพลาดด้วยตนเอง

จากนั้น C++ ได้นำเสนอ exception เพื่อให้เรามีวิธีที่เป็นระเบียบในการจัดการกับปัญหาที่ไม่คาดคิด ข้อยกเว้นจะถูกโยนด้วย throw และจับด้วย try/catch

มีสองประเภทของข้อผิดพลาดที่มักเกิดขึ้นบ่อย: ข้อผิดพลาดทางตรรกะ, เช่น การคำนวณที่ผิดพลาด, และข้อผิดพลาดที่เวลาทำงาน, เช่น การเข้าถึงที่อยู่หน่วยความจำที่ไม่ถูกต้อง ข้อยกเว้นเหมาะสำหรับข้อผิดพลาดที่เวลาทำงาน สำหรับข้อผิดพลาดทางตรรกะ, มักจะดีกว่าถ้าใช้ assertions หรือรหัสข้อผิดพลาด

มีการถกเถียงกันอย่างต่อเนื่องเกี่ยวกับข้อยกเว้นกับรหัสข้อผิดพลาด ข้อยกเว้นอาจช้าลงและอาจนำไปสู่การควบคุมที่ซับซ้อน รหัสข้อผิดพลาด, แม้ว่าจะเร็วกว่า, แต่อาจทำให้โค้ดรกและยากต่อการบำรุงรักษา เป็นการถ่วงน้ำหนัก, ดังนั้นการรู้ถึงกรณีการใช้งานของคุณจึงเป็นสิ่งสำคัญ

C++17 เสนอ std::optional และ std::variant, ซึ่งเป็นทางเลือกสำหรับข้อยกเว้น พวกเขามีประโยชน์สำหรับฟังก์ชันที่อาจหรืออาจไม่คืนผลลัพธ์ที่ถูกต้อง

ความปลอดภัยจากข้อยกเว้นอาจเป็นอีกปัญหาหนึ่ง มันเกี่ยวกับการรับประกันที่โค้ดของคุณให้แม้จะมีข้อยกเว้น มีสามระดับ: ระดับพื้นฐาน, ระดับแข็ง, และระดับไม่มีการโยน ยิ่งมีการรับประกันมากเท่าไหร่ โค้ดของคุณอาจมีความซับซ้อนมากขึ้น

ความคิดสุดท้าย—การจัดการข้อผิดพลาดเป็นทั้งศิลปะและวิทยาศาสตร์ มันกำหนดวิธีที่แอปพลิเคชันของคุณอยู่รอดในโลกภายนอก อย่าใช้ข้อยกเว้นมากเกินไป มุ่งเน้นไปที่โค้ดที่อ่านและบำรุงรักษาได้ง่าย

ดูเพิ่มเติม