news 2026/5/16 8:24:11

异常(try,throw,catch)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
异常(try,throw,catch)

文章目录

  • 异常
    • 概念
    • 异常抛出与捕获
    • 栈展开
    • 重新抛出异常
    • 异常规范

异常

概念

异常处理机制允许程序在运行时发现异常后抛出一个对象,会包含比c语言的错误码更全面的信息
抛出异常后会跳过后面的部分,跳转到异常处理模块

异常抛出与捕获

程序出现问题时会throw一个异常对象,该对象的类型及当前调用链决定由哪个catch处理该异常
throw执行后,throw后面的语句不再执行,跳转到与之匹配的catch代码块
异常对象可能是局部变量,所以还会生成一个异常对象的拷贝,并在在catch代码块执行完后销毁
catch只能捕获类型匹配的异常,如果一个异常有多个匹配的catch,就会被最近的那个捕获

栈展开

抛出异常后,程序会暂停当前函数,寻找catch

先检查throw有没有在try块内部,在的话就寻找try对应的catch 如果当前函数中没有try或者try和catch不匹配,则退出当前函数,返回外层函数中查找,称之为栈展开 如果展开到了main函数仍然没有catch,就会终止程序,所以一般在main函数最后都会使用一个catch(...),它会捕获任意类型的异常,但是不读取
voidfunc2(){throw"error";//抛出异常}voidfunc3(){throw404;}voidfunc1(){func2();//异常向上抛,触发栈展开func3();//也会抛出异常}intmain(){try{func1();}catch(conststring&e)//通过string&来捕获异常{cout<<"捕获string异常:"<<e<<endl;}catch(inte)//通过int类型来捕获异常{cout<<"捕获int异常:"<<e<<endl;}catch(...){cout<<"捕获未知异常"<<endl;}return0;}

重新抛出异常

在catch中直接throw,不写异常对象,会将捕获的异常再次抛出

异常规范

如果一段函数后面加了noexcept,表示该函数不会抛出异常,如果它里面又写了throw,会导致程序终止
noexcept(表达式)也可以用于判断一段表达式是否会抛出异常,返回值为bool
异常很容易导致死锁,在前面拿到了锁,后面抛出异常后跳过了,没有归还锁,可以通过catch手动解锁,但更推荐RAII自动处理

voidfunc(){try{throwstring("抛出异常");}catch(conststring&e){cout<<"内层捕获:"<<e<<endl;throw;// 重新抛出,交给外层处理}}intmain(){try{inta=0;boolres=noexcept(a=2);//赋值表达式,一定不会抛出异常,res=truefunc();}catch(conststring&e){cout<<"外层捕获:"<<e<<endl;}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 8:22:04

组合技能构建复杂自动化:OpenClaw高级工作流

组合技能构建复杂自动化&#xff1a;OpenClaw高级工作流 版本说明&#xff1a;本文基于OpenClaw 2026.3.2版本编写。该版本经过充分验证&#xff0c;稳定可靠&#xff0c;且预装了49个内置技能&#xff0c;本文的演示将主要依赖这些技能。 在OpenClaw的官方教程中&#xff0c;高…

作者头像 李华
网站建设 2026/5/16 8:22:02

基于Terraform与Azure的Dify AI平台一键自动化部署实践

1. 项目概述&#xff1a;一键部署企业级AI应用平台最近在帮一个初创团队搭建他们的AI应用开发环境&#xff0c;他们想快速验证几个基于大语言模型的内部工具&#xff0c;比如智能客服和文档分析助手。需求很明确&#xff1a;需要一个能快速集成各种AI模型、支持可视化编排工作流…

作者头像 李华
网站建设 2026/5/16 8:20:03

内存管理 1

这一块知识只是了解就行&#xff0c;但没听太懂左值&#xff1a;有名字、能放在赋值号左边、能取地址比如&#xff1a;普通变量 a、对象 aa右值&#xff1a;没名字、临时的、用完就扔比如&#xff1a;字面量 10、A() 匿名临时对象、表达式结果不同区不同生命周期&#xff0c;不…

作者头像 李华
网站建设 2026/5/16 8:19:12

从零构建高效爬虫:开源技能库与实战指南

1. 项目概述&#xff1a;一个开源技能库的诞生与价值最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的项目&#xff0c;叫ANVEAI/awesome-openclaw-skills。光看名字&#xff0c;awesome系列大家都不陌生&#xff0c;通常是某个领域优质资源的集合。但这个openclaw-skills就…

作者头像 李华
网站建设 2026/5/16 8:18:09

千问 LeetCode 2354.优质数对的数目 Python3实现

这道题的核心在于一个巧妙的位运算性质转换&#xff0c;理解了它&#xff0c;代码就很简单了。核心性质&#xff1a; 对于任意两个数 num1 和 num2&#xff0c;(num1 & num2) 和 (num1 | num2) 的二进制中 1 的个数之和&#xff0c;等于 num1 和 num2 各自二进制中 1 的个…

作者头像 李华