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

ชนิดข้อยกเว้นแบบกำหนดเอง

กำหนดข้อยกเว้นของคุณเอง

ชนิดข้อยกเว้นแบบกำหนดเอง เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องมีข้อยกเว้นแบบกำหนดเอง

การกำหนดชนิดข้อยกเว้นของคุณเองช่วยให้ผู้เรียกจับ ข้อผิดพลาดของคุณ ได้โดยเฉพาะ และเก็บข้อมูลเฉพาะด้านของขอบเขตงานไว้พร้อมกับข้อผิดพลาดได้

สืบทอดจากข้อยกเว้นมาตรฐาน

สร้างข้อยกเว้นของคุณโดยอิงจาก std::exception หรือคลาสย่อย เพื่อให้ทำงานร่วมกับตัวจัดการมาตรฐานและเปิดเผย what() ได้

#include <exception>
#include <string>

class ConfigError : public std::exception {
    std::string msg;
public:
    explicit ConfigError(std::string m) : msg(std::move(m)) {}
    const char* what() const noexcept override { return msg.c_str(); }
};

การโยนและการจับข้อยกเว้น

ชนิดข้อมูลของคุณจะทำงานเหมือนข้อยกเว้นอื่น ๆ: โยนข้อยกเว้น แล้วจับด้วยการอ้างอิง

#include <iostream>
#include <exception>
#include <string>

class ConfigError : public std::exception {
    std::string msg;
public:
    explicit ConfigError(std::string m) : msg(std::move(m)) {}
    const char* what() const noexcept override { return msg.c_str(); }
};

int main() {
    try {
        throw ConfigError("missing key");
    } catch (const ConfigError& e) {
        std::cout << e.what() << "\n";
    }
}

นำคลาสพื้นฐานมาตรฐานกลับมาใช้

บ่อยครั้งคุณสามารถสืบทอดจาก std::runtime_error หรือ std::logic_error ซึ่งเก็บข้อความไว้ให้แล้ว ทำให้ต้องเขียนโค้ดประกอบน้อยลง

#include <stdexcept>
#include <string>

class NetworkError : public std::runtime_error {
public:
    explicit NetworkError(const std::string& m) : std::runtime_error(m) {}
};

การเก็บข้อมูลเพิ่มเติม

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

#include <stdexcept>
#include <string>

class HttpError : public std::runtime_error {
public:
    int status;
    HttpError(int s, const std::string& m)
        : std::runtime_error(m), status(s) {}
};

การจับด้วยคลาสพื้นฐาน

เนื่องจากชนิดข้อมูลของคุณสืบทอดจาก std::exception ตัวจัดการทั่วไปจึงยังจับข้อยกเว้นนั้นผ่านการอ้างอิงไปยังคลาสพื้นฐานได้

#include <iostream>
#include <stdexcept>

class HttpError : public std::runtime_error {
public:
    int status;
    HttpError(int s, const std::string& m) : std::runtime_error(m), status(s) {}
};

int main() {
    try {
        throw HttpError(404, "not found");
    } catch (const std::exception& e) {
        std::cout << e.what() << "\n";
    }
}

สร้างลำดับชั้นข้อยกเว้น

จัดกลุ่มข้อผิดพลาดที่เกี่ยวข้องไว้ใต้คลาสพื้นฐานร่วม เพื่อให้ผู้เรียกจับข้อผิดพลาดทั้งกลุ่มหรือจับชนิดข้อมูลเฉพาะเพียงชนิดเดียวได้

#include <stdexcept>

struct AppError : std::runtime_error { using std::runtime_error::runtime_error; };
struct DbError  : AppError       { using AppError::AppError; };
struct AuthError: AppError       { using AppError::AppError; };

กำหนดให้ what() เป็น noexcept

เขียนทับ what() เป็น const noexcept และส่งคืนบัฟเฟอร์ที่ยังคงอยู่ เพราะฟังก์ชันนี้ต้องไม่โยนข้อยกเว้นหรือส่งคืนตัวชี้ที่ชี้ไปยังข้อมูลซึ่งหมดอายุแล้ว

โยนด้วยค่า

โยนอ็อบเจ็กต์ข้อยกเว้นด้วยค่า เช่น throw HttpError(500, "x"); ระบบขณะทำงานจะจัดการพื้นที่จัดเก็บระหว่างการคลายสแตก

บันทึกชนิดข้อยกเว้นที่โยน

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

ทำให้เรียบง่าย

โครงการส่วนใหญ่ต้องการชนิดข้อยกเว้นเพียงไม่กี่ชนิด การสืบทอดจาก std::runtime_error ครอบคลุมกรณีส่วนใหญ่ได้อย่างเหมาะสม

ตรวจสอบความเข้าใจสั้น ๆ

ทดสอบความเข้าใจของคุณเกี่ยวกับข้อยกเว้นแบบกำหนดเอง

สรุป

คุณได้เรียนรู้การกำหนด ชนิดข้อยกเว้นแบบกำหนดเอง ด้วยการสืบทอดจาก std::exception หรือ std::runtime_error การเก็บข้อมูลเพิ่มเติม การสร้างลำดับชั้น การทำให้ what() เป็น noexcept และการโยนด้วยค่า ควรรักษาจำนวนชนิดข้อมูลให้มีน้อยและจัดทำเอกสารกำกับ

คำถามที่พบบ่อย

บทเรียน “ชนิดข้อยกเว้นแบบกำหนดเอง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ชนิดข้อยกเว้นแบบกำหนดเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ชนิดข้อยกเว้นแบบกำหนดเอง”

กำหนดข้อยกเว้นของคุณเอง คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

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

บทเรียน “ชนิดข้อยกเว้นแบบกำหนดเอง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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