วิธีที่ดีกว่าจริงๆคือการสร้างคลาส (หรือคลาส) สำหรับข้อยกเว้น
สิ่งที่ต้องการ:
class ConfigurationError : public std::exception {
public:
ConfigurationError();
};
class ConfigurationLoadError : public ConfigurationError {
public:
ConfigurationLoadError(std::string & filename);
};
เหตุผลก็คือข้อยกเว้นนั้นดีกว่าการถ่ายโอนสตริง การให้คลาสที่แตกต่างกันสำหรับข้อผิดพลาดคุณให้โอกาสนักพัฒนาในการจัดการกับข้อผิดพลาดเฉพาะในลักษณะที่สอดคล้องกัน (ไม่ใช่แค่แสดงข้อความแสดงข้อผิดพลาด) คนที่จับข้อยกเว้นของคุณสามารถเจาะจงได้ตามที่ต้องการหากคุณใช้ลำดับชั้น
ก) อาจจำเป็นต้องทราบเหตุผลที่เฉพาะเจาะจง
} catch (const ConfigurationLoadError & ex) {
// ...
} catch (const ConfigurationError & ex) {
ก) อีกคนไม่ต้องการทราบรายละเอียด
} catch (const std::exception & ex) {
คุณสามารถค้นหาแรงบันดาลใจเกี่ยวกับหัวข้อนี้ได้ในhttps://books.google.ru/books?id=6tjfmnKhT24Cบทที่ 9
นอกจากนี้คุณสามารถระบุข้อความที่กำหนดเองได้เช่นกัน แต่โปรดระวัง - การเขียนข้อความด้วยวิธีใดวิธีหนึ่งstd::string
หรือstd::stringstream
วิธีอื่นใดที่อาจทำให้เกิดข้อยกเว้นไม่ปลอดภัยไม่ปลอดภัย
โดยทั่วไปไม่มีความแตกต่างไม่ว่าคุณจะจัดสรรหน่วยความจำ (ทำงานกับสตริงในลักษณะ C ++) ในตัวสร้างข้อยกเว้นหรือก่อนโยน - std::bad_alloc
ข้อยกเว้นสามารถโยนก่อนที่คุณต้องการจริงๆ
ดังนั้นบัฟเฟอร์ที่จัดสรรบนสแต็ก (เช่นในคำตอบของ Maxim) จึงเป็นวิธีที่ปลอดภัยกว่า
มีการอธิบายไว้เป็นอย่างดีที่http://www.boost.org/community/error_handling.html
ดังนั้นวิธีที่ดีกว่าจะเป็นประเภทเฉพาะของข้อยกเว้นและหลีกเลี่ยงการเขียนสตริงที่จัดรูปแบบ (อย่างน้อยเมื่อขว้างปา)
std∷exception
ไม่มีตัวสร้างที่มีchar*
อาร์กิวเมนต์