文章目录异常概念异常抛出与捕获栈展开重新抛出异常异常规范异常概念异常处理机制允许程序在运行时发现异常后抛出一个对象会包含比c语言的错误码更全面的信息抛出异常后会跳过后面的部分跳转到异常处理模块异常抛出与捕获程序出现问题时会throw一个异常对象该对象的类型及当前调用链决定由哪个catch处理该异常throw执行后throw后面的语句不再执行跳转到与之匹配的catch代码块异常对象可能是局部变量所以还会生成一个异常对象的拷贝并在在catch代码块执行完后销毁catch只能捕获类型匹配的异常如果一个异常有多个匹配的catch就会被最近的那个捕获栈展开抛出异常后程序会暂停当前函数寻找catch先检查throw有没有在try块内部在的话就寻找try对应的catch 如果当前函数中没有try或者try和catch不匹配则退出当前函数返回外层函数中查找称之为栈展开 如果展开到了main函数仍然没有catch就会终止程序所以一般在main函数最后都会使用一个catch(...)它会捕获任意类型的异常但是不读取voidfunc2(){throwerror;//抛出异常}voidfunc3(){throw404;}voidfunc1(){func2();//异常向上抛触发栈展开func3();//也会抛出异常}intmain(){try{func1();}catch(conststringe)//通过string来捕获异常{cout捕获string异常eendl;}catch(inte)//通过int类型来捕获异常{cout捕获int异常eendl;}catch(...){cout捕获未知异常endl;}return0;}重新抛出异常在catch中直接throw不写异常对象会将捕获的异常再次抛出异常规范如果一段函数后面加了noexcept表示该函数不会抛出异常如果它里面又写了throw会导致程序终止noexcept表达式也可以用于判断一段表达式是否会抛出异常返回值为bool异常很容易导致死锁在前面拿到了锁后面抛出异常后跳过了没有归还锁可以通过catch手动解锁但更推荐RAII自动处理voidfunc(){try{throwstring(抛出异常);}catch(conststringe){cout内层捕获eendl;throw;// 重新抛出交给外层处理}}intmain(){try{inta0;boolresnoexcept(a2);//赋值表达式一定不会抛出异常restruefunc();}catch(conststringe){cout外层捕获eendl;}return0;}
异常(try,throw,catch)
发布时间:2026/5/16 8:24:12
文章目录异常概念异常抛出与捕获栈展开重新抛出异常异常规范异常概念异常处理机制允许程序在运行时发现异常后抛出一个对象会包含比c语言的错误码更全面的信息抛出异常后会跳过后面的部分跳转到异常处理模块异常抛出与捕获程序出现问题时会throw一个异常对象该对象的类型及当前调用链决定由哪个catch处理该异常throw执行后throw后面的语句不再执行跳转到与之匹配的catch代码块异常对象可能是局部变量所以还会生成一个异常对象的拷贝并在在catch代码块执行完后销毁catch只能捕获类型匹配的异常如果一个异常有多个匹配的catch就会被最近的那个捕获栈展开抛出异常后程序会暂停当前函数寻找catch先检查throw有没有在try块内部在的话就寻找try对应的catch 如果当前函数中没有try或者try和catch不匹配则退出当前函数返回外层函数中查找称之为栈展开 如果展开到了main函数仍然没有catch就会终止程序所以一般在main函数最后都会使用一个catch(...)它会捕获任意类型的异常但是不读取voidfunc2(){throwerror;//抛出异常}voidfunc3(){throw404;}voidfunc1(){func2();//异常向上抛触发栈展开func3();//也会抛出异常}intmain(){try{func1();}catch(conststringe)//通过string来捕获异常{cout捕获string异常eendl;}catch(inte)//通过int类型来捕获异常{cout捕获int异常eendl;}catch(...){cout捕获未知异常endl;}return0;}重新抛出异常在catch中直接throw不写异常对象会将捕获的异常再次抛出异常规范如果一段函数后面加了noexcept表示该函数不会抛出异常如果它里面又写了throw会导致程序终止noexcept表达式也可以用于判断一段表达式是否会抛出异常返回值为bool异常很容易导致死锁在前面拿到了锁后面抛出异常后跳过了没有归还锁可以通过catch手动解锁但更推荐RAII自动处理voidfunc(){try{throwstring(抛出异常);}catch(conststringe){cout内层捕获eendl;throw;// 重新抛出交给外层处理}}intmain(){try{inta0;boolresnoexcept(a2);//赋值表达式一定不会抛出异常restruefunc();}catch(conststringe){cout外层捕获eendl;}return0;}