C++学习笔记9_异常处理
异常处理
int divide(int a,int b)
{
if(b==0)
{
return -1;//然而,10,-10也是结果-1,所以要抛出异常了
}
}
//在异常不能通过返回值表示,也不能忽略(可能忘记对返回值进行处理)的情况下,需要抛出
int divide(int a,int b)
{
if(b==0)
{
throw b;//随便抛一个东西出去?
//注意,这里和C#不一样,C#的所有异常均继承Exception几类,而且是new Exception("error"),直接在托管堆上new
}
}
int main()
{
try
{
divide(10,0);
}
catch (int)//也可以为catch(int e),异常是根据类型匹配的,这里有点像C#(C# 是 catch(Excpetion e))
{
cout<<"除数为0"<<endl;
}
}
*为了增强可读性,最好有专门的异常接口声明
void func() throw(int,float,char);//这个函数,可能会抛出int,float,char类型的异常。
void func() throw();//不抛出任何异常
*catch(...)//三个点,捕获所有异常,注意,捕获所欲异常,是指能抛出的异常,有些访问越界这样的错误,是没办法捕获,直接挂了的。
注意:
抛出异常,其实和返回一个类型值差不多,所以,也有构造,拷贝,析构的过程。所以,自定义异常类,要做好构造、拷贝、析构的工作。
特别是,有char* errorMsg;这样子的。
throw MyException("aaaa");
catch(MyException &e);//也可以通过引用来接,虽然MyException也属于局部变量,讲道理,执行完函数就析构了,但是,使用catch来接,会在处理完异常,才销毁。这样,就不用执行拷贝构造了。
注意:
不要throw & (MyException("aaaa"))指针,因为如果不是抛出引用,出了方法后,会立刻析构掉!!!
除非 throw new MyException("aaaa");
并且
catch(MyException *e)
{
delete e;
}
* C++有标准的异常基类,叫exception,还有其他派生的异常类。
#include<stdexcept>//标准异常类
throw out_of_range("超出数组界限");//不需要重写什么函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2017-10-22 学习笔记53_C#操作MongoDB
2017-10-22 学习笔记52_mongodb增删改查
2017-10-22 学习笔记51_MongoDB使用
2017-10-22 学习笔记50_mongodb