C++之异常处理学习笔记
来源:互联网 发布:淘宝和拼多多哪个货真 编辑:程序博客网 时间:2024/06/08 19:02
看了国嵌的深度实践c++视频,记录下,C++中提供了try和catch语句块对可能产生异常的代码进行分开处理。Try语句块处理正常逻辑。Catch语句块处理异常。C++语言中通过throw语句引发一个异常。
Throw语句用于将异常对象抛出,throw语句将异常抛出,如果在当前函数中没有try … catch语句能够处理该异常,则当前函数将立即返回。
异常被传递到上层调用函数,仍然需要try … catch语句进行处理,如果上层函数也没有能力处理该异常,则异常继续向更上层函数的函数传递。
如果在函数调用栈中的所有函数都无法处理抛出的异常,则程序异常终止。
例如:
int test(int i)
{
if( i == 1 )
{
throw -1;
}
if( i == 2 )
{
throw "ERROR";
}
if( i == 3 )
{
throw 0.5;
}
if( i == 4 )
{
throw 'd';
}
return i;
}
在使用时:
for(int i=0; i<5; i++)
{
try
{
cout<<test(i)<<endl;
}
catch(int e)//根据抛出的类型决定怎样异常处理
{
cout<<"Int: "<<e<<endl;
}
catch(const char* e)
{
cout<<"const char*: "<<e<<endl;
}
catch(double e)
{
cout<<"double: "<<e<<endl;
}
}
C++中的catch语句可以使用…捕获所有的异常。Catch(…)可以捕获所有异常但却无法得到异常信息。Catch(…)一般作为最后一个异常处理块出现。当我们看到代码中的catch就要意识到这里在处理异常情况,而异常是在对应的try中产生的。
try catch语句也是可以嵌套的,在catch(…)语句块中,可以通过不带参数的throw语句抛出捕获的异常。
不要在构造函数中抛出异常,在构造函数可能申请系统资源,而在构造函数中抛出异常会导致对象构造不完全。不完全对象的析构函数是不会被调用的,因此可能造成资源泄漏。
在工程中可以使用标准库中的异常类,可以将标准库中的异常类作为基类派生新的异常类,标准库中的异常都是从exception类派生的。Exception类有两个主要的分支,logic_error用于描述程序中出现的逻辑错误,比如,传递无效参数,,,runtime_error用于描述无法预料的事件所造成的,如:内存耗尽、硬件错误。
logic_error 和runtime_error都提供了一个参数为字符串的构造函数,这样就可以保持错误信息。通过what()成员函数就可以得到错误的信息。
例如;
classdivide_by_zero : public logic_error
{
public:
divide_by_zero(const char* s) :logic_error(s)
{
}
};
doubleDiv(double a, double b)
{
if((-0.00000001 < b) && ( b < 0.00000001) )
{
throw divide_by_zero("Divide byzero...");
}
return a / b;
}
使用时:
try
{
cout<<Div(1, 0)<<endl;
}
catch(exception& e)
{
cout<<e.what()<<endl;
}
- C++&windows异常处理学习笔记
- oralce学习笔记之异常处理篇
- oralce学习笔记之异常处理篇
- php学习笔记之php异常处理
- WCF 学习笔记之异常处理
- CSharp学习笔记之七 异常处理
- C++之异常处理学习笔记
- php学习笔记之PDO异常处理
- Java学习笔记之异常处理
- JavaSE学习笔记之-----异常处理
- Struts2.x学习笔记之 异常处理
- C++学习笔记之异常处理
- Java之异常处理学习笔记
- 20170729学习笔记之异常处理
- SpringBoot学习笔记之异常处理
- JAVA学习笔记之(异常与异常处理)
- Java学习笔记之异常、处理异常、异常抛出、自定义异常、异常链
- 异常处理学习笔记
- hdu 1026 bfs(数组模拟,路径输出)
- Delete HDU5210 (模拟贪心)
- java基础笔记之异常
- 数据结构学习笔记----排序
- (结构型模式二)装饰模式
- C++之异常处理学习笔记
- android解析JSON
- iphone常用控件之UIScrollView
- 可以将资源移动到相同的域名上或者启用 CORS 来解决这个问题(跨域问题)、options请求报错
- Git的一些命令
- 数据库技术
- Python import .pyd 可能遇到路径的问题
- C# Dictionary修改遇到的一个错误 out of sync!
- HTML介绍及运行原理