异常被抛出后,从try起,到异常被抛出前,这期间在栈上构造的所有对象,都会被自动析构,析构的顺序与构造的顺序相反这个过程被称为栈解旋
//异常的基本语法
//异常类
class My_exception
{
public:
My_exception()
{
cout<<"构造函数调用"<<endl;
}
~My_exception()
{
cout<<"析构函数调用"<<endl;
}
};
int divide(int x,int y)
{
if(y == 0)
{
throw y;
}
return x/y;
}
//异常跨函数
//异常必须处理
int mian()
{
try{
divide(10,0)
}catch(int e)
{
cout<<"divide by 0"<<"e"<<e<<endl;
}
return 0;
}
c++异常处理
程序运行时常会碰到一些异常情况,例如:做除法的时候除数为 0;用户输入年龄时输入了一个负数;用 new 运算符动态分配空间时,空间不够导致无法分配;访问数组元素时,下标越界;打开文件读取时,文件不存在等等。
这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃。
所谓“处理”,可以是给出错误提示信息,然后让程序沿一条不会出错的路径继续执行;也可能是不得不结束程序,但在结束前做一些必要的工作,如将内存中的数据写入文件、关闭打开的文件、释放动态分配的内存空间等。
C++ 引入了异常处理机制。其基本思想是:函数 A 在执行过程中发现异常时可以不加处理,而只是“拋出一个异常”给 A 的调用者,假定为函数 B。
拋出异常而不加处理会导致函数 A 立即中止,在这种情况下,函数 B 可以选择捕获 A 拋出的异常进行处理,也可以选择置之不理。如果置之不理,这个异常就会被拋给 B 的调用者,以此类推。
如果一层层的函数都不处理异常,异常最终会被拋给最外层的 main 函数。main 函数应该处理异常。如果main函数也不处理异常,那么程序就会立即异常地中止。
std::exception是所有标准异常的基类。标准异常的继承关系如下:
C++异常处理基本语法
C++ 通过 throw 语句和 try...catch 语句实现对异常的处理。throw 语句的语法如下:
throw
该语句拋出一个异常。异常是一个表达式,其值的类型可以是基本类型,也可以是类。
try
catch 可以有多个,但至少要有一个。
不妨把 try 和其后{}中的内容称作“try块”,把 catch 和其后{}中的内容称作“catch块”
try...catch 语句的执行过程是:执行 try 块中的语句,如果执行的过程中没有异常拋出,那么执行完后就执行最后一个 catch 块后面的语句,所有 catch 块中的语句都不会被执行;如果 try 块执行的过程中拋出了异常,那么拋出异常后立即跳转到第一个“异常类型”和拋出的异常类型匹配的 catch 块中执行(称作异常被该 catch 块“捕获”),执行完后再跳转到最后一个 catch 块后面继续执行。
例如下面的程序:
#include
程序的运行结果如下:
9
说明当 n 不为 0 时,try 块中不会拋出异常。因此程序在 try 块正常执行完后,越过所有的 catch 块继续执行,catch 块一个也不会执行。
程序的运行结果也可能如下:
9
当 n 为 0 时,try 块中会拋出一个整型异常。拋出异常后,try 块立即停止执行。该整型异常会被类型匹配的第一个 catch 块捕获,即进入catch(int e)块执行,该 catch 块执行完毕后,程序继续往后执行,直到正常结束。
如果拋出的异常没有被 catch 块捕获,例如,将catch(int e),改为catch(char e),当输入的 n 为 0 时,拋出的整型异常就没有 catch 块能捕获,这个异常也就得不到处理,那么程序就会立即中止,try...catch 后面的内容都不会被执行。
1. try{} catch(){}
c++异常处理涉及到三个异常关键字:try、catch、throw
try
{
throw "error";
}
catch(const char* e)
{
cout<<"Hello error"<<endl;
}
try
{
std::bad_alloc t;
throw t;
}
catch(std::bad_alloc &e)
{
cerr <<e.what()<<'\n';
}
try
{
throw std::exception();
}
catch(...)//捕获所有异常
{
std::cerr << "Hello exception" << '\n';
}
标准异常
2. 如何定义自己的异常
定义自己的异常MyException
struct MyException : public exception
{
const char * what () const throw ()
{
return "C++ Exception";
}
};
需要重载what方法。
以上就是c++异常处理的方法的详细内容,希望对你有所帮助。
您可能感兴趣的文章:
- C++中的异常处理机制详解
- c++异常处理机制示例及详细讲解
- 深入了解C++异常处理
- C++学习笔记之浅谈异常处理
- 一篇文章带你入门C++的异常处理
- 详解C++异常处理(try catch throw)完全攻略
- C++常见异常处理原理及代码示例解析
- 详解C++异常处理机制示例介绍
- https://blog.csdn.net/sinat_36304757/article/details/106950470
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)