小学生学C++编程语法知识(C++异常处理(Exception)入门)

小学生学C++编程语法知识(C++异常处理(Exception)入门)
魔法城堡里的警报器——C异常处理Exception入门一、故事开始程序王国的危险按钮1、在程序王国里小Q是一名魔法程序员。一天国王交给他一个任务请写一个计算除法的程序小Q很快写出了程序cout 10 / 2;运行5成功2、可是国王又说如果有人输入0呢例如cout 10 / 0;3、这时候……程序王国突然响起了警报轰 程序崩溃4、因为任何数字都不能除以0所以程序出现了严重错误。二、有没有办法提前报警1、现实生活中电影院失火怎么办有火警报警器灭火器安全出口2、程序也是一样。如果发生危险不要让程序直接崩溃而是先发现危险再进行处理。这就是——异常处理ExceptionException意思就是程序运行过程中发生了意外。3、例如除以0文件打不开数组越界有些情况内存不足这些都叫异常Exception三、异常处理三兄弟1、C异常处理只有三个关键词。try throw catch就像消防队一样。2、第一位try1意思这里可能发生危险请盯着。2例如try { cout 10 / x; }3try里面放可能发生错误的代码。3、第二位throw1意思危险危险快报警2例如throw Zero Error;程序立即停止当前工作。跳出去找救援人员。4、第三位catch1意思收到报警我来处理。2例如catch(const char* msg) { cout msg; }catch负责接住异常。3所以throw ↓ catchthrow抛出去catch接住4是不是像扔球一样throw ○ catch \o/四、完整流程1、例如try { if(y0) throw Zero Error; coutx/y; } catch(const char* msg) { coutmsg; }2、整个流程进入try ↓ y是不是0 ↓ 不是 ↓ 继续运行 ↓ 结束 ------------------- 如果是0 ↓ throw ↓ 跳出try ↓ 进入catch ↓ 输出错误信息五、GESP真题讲解1、题目try { int x 10, y 0; if (y 0) throw Zero Error; cout x / y; } catch (int e) { cout Error Code: e; } catch (const char* msg) { cout Caught: msg; }问输出什么2、第一步x10 y03、第二步执行if(y0)成立。于是throw Zero Error;4、这里抛出的是什么注意Zero Error是字符串。类型const char*不是int5、第三步程序开始寻找有没有能接住const char*的catch。1第一个catch(int e)接不了。继续找。2第二个catch(const char* msg)完全匹配进入。执行coutCaught: msg;msg就是Zero Error所以输出Caught: Zero Error六、如果没有catch呢1、例如try { throw Error; }没有catch(...)那么程序直接结束。2、程序会发现有人把异常扔出来了throw但是没有任何人接catch1于是程序会调用一个系统函数std::terminate()程序就在这里结束了。2很多编译器会看到类似的信息terminate called after throwing an instance of ...或者terminate called after throwing ...不同编译器提示略有不同。3、这算不算程序崩溃1它并不是程序因为内存错误、野指针等原因崩溃Crash。而是程序因为未处理的异常Unhandled Exception被系统终止Terminate了。2也就是说throw ↓ 没有任何catch ↓ std::terminate() ↓ 程序结束3所以准确的说法应该是程序因为异常没有被处理而终止运行。七、GESP真题讲解1、题目int divi(int a,int b) { if(b0) throw 0; return a/b; } int main() { try { coutdivi(10,0); } catch(const char* msg) { coutA; } catch(int) { coutB; } }1第一步进入divi(10,0)b0于是throw 0;注意抛出的是什么0它是什么类型int不是字符串。2开始找catch。第一个catch(const char*)接不了。第二个catch(int)成功3执行coutB;输出B八、GESP真题讲解1、程序int divide(int a,int b) { if(b0) throw Division by zero; return a/b; } int main() { int result0; try { resultdivide(10,0); coutA; } catch(const char* msg) { coutB; result-1; } coutresult; }2、第一步执行divide(10,0)b0于是throw Division by zero;3、注意一旦throw发生。后面的coutA;不会执行很多同学最容易错这里。程序已经跳出try。4、进入catch(const char*)输出B然后result-1;最后coutresult;输出-1所以最终B-1答案B九、为什么 throw 后面的代码不执行1、例如cout开始; throw 1; cout结束;很多同学以为开始 结束其实不是。2、执行到throw程序立刻跳走。所以开始结束。后面的全部跳过。3、可以理解成throw ↓ 立刻跳到catch十、异常处理完整模板最经典写法try { //可能发生危险 } catch(int x) { //处理int异常 } catch(const char* msg) { //处理字符串异常 }如果可能抛出多种异常就可以写多个catch。十一、万能接收器1、如果不知道会抛出什么类型。可以写catch(...) { cout发生未知错误; }三个点...表示什么异常都接2、例如try { throw 3.14; } catch(...) { cout万能接收; }输出万能接收十二、异常处理流程图程序开始 │ ▼ try │ ▼ 有没有异常 │ │ 没有 有 │ │ ▼ ▼ 继续执行 throw │ │ ▼ ▼ 结束 找catch │ 找到──────┐ │ │ 是 否 │ │ ▼ ▼ 执行catch 程序终止 │ ▼ 继续执行后面的代码十三、记忆口诀try 看守危险区throw 报警抛出去catch 接住来处理程序安全不崩溃。十四、课堂练习第一题try { throw 5; } catch(int x) { coutx; }输出答案5第二题try { throw Hello; } catch(int) { coutA; } catch(const char* s) { couts; }输出答案Hello第三题try { coutA; throw 10; coutB; } catch(int) { coutC; }输出分析输出Athrow 10后立即跳转B不会执行进入catch(int)输出C答案AC第四题try { throw Error; } catch(...) { coutOK; }输出答案OK十五、本课总结今天我们认识了 C 的异常处理机制它就像程序里的“安全警报系统”。要记住三个关键词关键字作用可以理解成try放可能出错的代码安全监控区throw抛出异常拉响警报catch捕获并处理异常消防员同时牢记四个重要规律throw抛出的数据类型要与catch的类型匹配。执行到throw后try中后面的代码不会继续执行。如果没有匹配的catch程序通常会终止。catch(...)可以捕获任何类型的异常是一个“万能接收器”。对于 GESP 考试而言最常见的考点就是判断throw抛出的类型判断哪个catch能成功接住异常理解throw后代码是否继续执行判断程序最终的输出结果。只要掌握了这几条规律这类题目就能快速、准确地完成。