แม้ว่าคำถามนี้จะค่อนข้างเก่าและได้รับคำตอบมากมาย แต่ฉันแค่ต้องการเพิ่มหมายเหตุเกี่ยวกับวิธีจัดการข้อยกเว้นที่เหมาะสมใน C ++ 11 เนื่องจากฉันพลาดสิ่งนี้อย่างต่อเนื่องในการอภิปรายเกี่ยวกับข้อยกเว้น:
มีอธิบายไว้ใน StackOverflow ที่นี่และที่นี่คุณจะได้รับ backtrace ในข้อยกเว้นของคุณอย่างไรภายในโค้ดของคุณโดยไม่ต้องใช้ดีบักเกอร์หรือการบันทึกที่ยุ่งยากเพียงแค่เขียนตัวจัดการข้อยกเว้นที่เหมาะสมซึ่งจะลบข้อยกเว้นที่ซ้อนกันใหม่
เนื่องจากคุณสามารถทำสิ่งนี้กับคลาสข้อยกเว้นที่ได้รับใด ๆ คุณจึงสามารถเพิ่มข้อมูลจำนวนมากลงใน backtrace ดังกล่าวได้! คุณสามารถดูMWEของฉันบน GitHubซึ่ง backtrace จะมีลักษณะดังนี้:
Library API: Exception caught in function 'api_function'
Backtrace:
~/Git/mwe-cpp-exception/src/detail/Library.cpp:17 : library_function failed
~/Git/mwe-cpp-exception/src/detail/Library.cpp:13 : could not open file "nonexistent.txt"
คุณไม่จำเป็นต้องซับคลาสด้วยซ้ำ std::runtime_error
เพื่อรับข้อมูลมากมายเมื่อมีข้อยกเว้นเกิดขึ้น
ประโยชน์เดียวที่ฉันเห็นในคลาสย่อย (แทนที่จะใช้เพียงอย่างเดียวstd::runtime_error
) คือตัวจัดการข้อยกเว้นของคุณสามารถตรวจจับข้อยกเว้นที่กำหนดเองของคุณและทำสิ่งพิเศษได้ ตัวอย่างเช่น:
try
{
}
catch( const MyException & ex )
{
}
catch( const std::exception & ex )
{
std::cerr << ex.what() << std::endl;
}
catch( ... )
{
std::cerr << "unknown exception!" << std::endl;
}