ชนิดข้อยกเว้นแบบกำหนดเอง
กำหนดข้อยกเว้นของคุณเอง
ชนิดข้อยกเว้นแบบกำหนดเอง เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- try, catch, throw
- ความปลอดภัยของข้อยกเว้น
- ตัวระบุ noexcept
- ชนิดข้อยกเว้นแบบกำหนดเอง