บทช่วยสอน c ++ จัดการข้อยกเว้น ที่ดีที่สุดในปี 2024 ในบทช่วยสอนนี้ คุณสามารถเรียนรู้ โยนข้อยกเว้น,จับข้อยกเว้น,c ++ ข้อยกเว้นมาตรฐาน,กำหนดข้อยกเว้นใหม่,
ยกเว้นปัญหาขั้นตอนที่เกิดขึ้นระหว่างการดำเนินการ c ++ ยกเว้นหมายถึงการเกิดขึ้นเป็นพิเศษเมื่อโปรแกรมทำงานเช่นความพยายามที่จะแบ่งโดยการดำเนินการศูนย์
ยกเว้นจะให้วิธีการถ่ายโอนการควบคุมโปรแกรม c ++จัดการข้อยกเว้นเกี่ยวข้องกับสามคำสำคัญ: ลองจับโยน
หากมีการบล็อกพ่นยกเว้นจับวิธีการยกเว้นการใช้และพยายามจับคำหลักลองวางบล็อกของรหัสอาจโยนยกเว้นพยายามป้องกันรหัสเป็นที่รู้จักกันเป็นรหัสที่มีการป้องกัน ใช้ลอง / จับไวยากรณ์คำสั่งดังต่อไปนี้:
try { // 保护代码 }catch( ExceptionName e1 ) { // catch 块 }catch( ExceptionName e2 ) { // catch 块 }catch( ExceptionName eN ) { // catch 块 }
ถ้าคุณพยายามบล็อกในบริบทที่แตกต่างกันจะโยนข้อยกเว้นที่แตกต่างกันเวลานี้คุณสามารถลองรายการงบจับหลายที่จะจับความแตกต่างของข้อยกเว้น
คุณสามารถใช้คำสั่งการโยนที่ใดก็ได้ในการป้องกันรหัสพ่นยกเว้นคำสั่งจากเส้นข้างตัวถูกดำเนินการสามารถพิมพ์นิพจน์ใด ๆ ของผลการแสดงออกที่กำหนดประเภทของข้อยกเว้นโยน
ต่อไปนี้เป็นข้อยกเว้นลองศูนย์หารด้วยตัวอย่าง:
double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); }
จับบล็อกที่อยู่เบื้องหลังบล็อกลองไปจับข้อยกเว้นคุณสามารถระบุชนิดของข้อยกเว้นคุณต้องการจับภาพซึ่งถูกประกาศโดยข้อยกเว้นในวงเล็บหลังตัดสินใจจับคำหลัก
try { // 保护代码 }catch( ExceptionName e ) { // 处理 ExceptionName 异常的代码 }
รหัสข้างต้นจะจับชนิดยกเว้นExceptionNameหากคุณต้องการที่จะจับบล็อกสามารถจัดการกับชนิดของการยกเว้นโยนลองบล็อกใด ๆ ที่คุณต้องใช้ข้อยกเว้นในวงเล็บจุดไข่ปลา th. คำสั่งดังต่อไปนี้:
try { // 保护代码 }catch(th.) { // 能处理任何异常的代码 }
นี่คือตัวอย่างของการหารด้วยศูนย์พ่นยกเว้นและข้อยกเว้นที่ถูกจับได้ในการป้องกันการจับ
#include <iostream> using namespace std; double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); } int main () { int x = 50; int y = 0; double z = 0; try { z = division(x, y); cout << z << endl; }catch (const char* msg) { cerr << msg << endl; } return 0; }
เนื่องจากเราโยนประเภทยกเว้นconst char * ดังนั้นเมื่อจับที่ข้อยกเว้นเราจะต้องใช้ถ่าน const * ในการป้องกันการจับเมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
Division by zero condition!
C ++ ให้ชุดของข้อยกเว้นมาตรฐานกำหนดไว้ใน<ยกเว้น> เราสามารถใช้ข้อยกเว้นมาตรฐานเหล่านี้ในโปรแกรมพวกเขาจะขึ้นอยู่กับลำดับชั้นผู้ปกครองเด็กที่จัดดังนี้
ตารางต่อไปนี้คือคำอธิบายของแต่ละลำดับชั้นดังกล่าวข้างต้นปรากฏผิดปกติ:
异常 | 描述 |
---|---|
std::exception | 该异常是所有标准 C++ 异常的父类。 |
std::bad_alloc | 该异常可以通过new抛出。 |
std::bad_cast | 该异常可以通过dynamic_cast抛出。 |
std::bad_exception | 这在处理 C++ 程序中无法预期的异常时非常有用。 |
std::bad_typeid | 该异常可以通过typeid抛出。 |
std::logic_error | 理论上可以通过读取代码来检测到的异常。 |
std::domain_error | 当使用了一个无效的数学域时,会抛出该异常。 |
std::invalid_argument | 当使用了无效的参数时,会抛出该异常。 |
std::length_error | 当创建了太长的 std::string 时,会抛出该异常。 |
std::out_of_range | 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。 |
std::runtime_error | 理论上不可以通过读取代码来检测到的异常。 |
std::overflow_error | 当发生数学上溢时,会抛出该异常。 |
std::range_error | 当尝试存储超出范围的值时,会抛出该异常。 |
std::underflow_error | 当发生数学下溢时,会抛出该异常。 |
คุณสามารถกำหนดข้อยกเว้นใหม่โดยการรับมรดกระดับข้อยกเว้นและการบรรทุกเกินพิกัดตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการใช้งานระดับมาตรฐาน :: ข้อยกเว้นที่จะใช้ข้อยกเว้นของเขาเอง
#include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "C++ Exception"; } }; int main() { try { throw MyException(); } catch(MyException& e) { std::cout << "MyException caught" << std::endl; std::cout << e.what() << std::endl; } catch(std::exception& e) { //其他的错误 } }
นี้ก่อให้เกิดผลลัพธ์ต่อไปนี้:
MyException caught C++ Exception
นี่คือสิ่งที่ () วิธีการเป็นชั้นยกเว้นประชาชนโดยมีเงื่อนไขว่าจะได้รับมากเกินไปทุกชั้นเรียนยกเว้นย่อยนี้จะกลับสาเหตุของข้อยกเว้นนี้สร้างขึ้น