简介
throw:抛,在出错的地方抛出异常信息。
try:尝试捕获throw抛出的异常信息。
catch:有个参数用来接收捕获的异常信息(参数类型需和抛出的错误信息类型保持一致)
catch(…):捕获所有异常信息
#include<iostream>
using namespace std;
int divide(int numOne,int numTwo)
{
if (0 == numTwo)
throw "除数不能为零"; //抛出char*型的异常信息,一旦抛出异常就会直接跳出。
else
return numOne / numTwo;
}
int main() {
try {
divide(3, 0);
}
catch (char* e) //捕获异常信息(也为char*型)
{
cout << e << endl;
}
system("pause");
return 0;
}
运行结果:
异常信息抛的方式
在函数一层层的调用之后会形成栈的结构,异常信息会从抛出它的地方一层层往上抛,每网上抛一层,前一个抛它的函数所被分配的栈区就会被随之回收,直到被catch到,如果用户没有写catch语句,这些异常信息最终会被编译器捕获。
#include<iostream>
using namespace std;
void Foo3()
{
throw "foo3";
}
void Foo2()
{
Foo3();
}
void Foo1()
{
Foo2();
}
int main() {
try {
Foo1();
}
catch (char* e)
{
cout << e << endl;
}
system("pause");
return 0;
}
运行结果:
c++用于异常处理的类
exception :基类
runtime_error:运行时错误
overfloe_error:算术溢出错误
range_error:范围出现错误
underflow_error:堆栈上溢
logic_error:逻辑错误,语法错误
invalid_argument :不存在的参数
length_error:要表示的字符串的长度过过长, 超出所能表示的最大限制
out_of_range :超出范围
bad_alloc:分配空间时出错
bad_cast:类型转换出错时
注意
不到万不得已不要抛回指针,因为可能抛出的指针指向的是栈区,而异常信息的抛出会随之会回收栈区,导致指针变为非法访问。
一般定义自己的异常类会继承类exception,在捕获异常时也要记得把对自己异常类的捕获写在对系统默认异常类的捕获前面,因为基类指针可以指向派生类对象,派生类指针不能指向基类对象,这样可以优先获取到自己定义的异常信息