概述
C语言的异常缺陷在于返回值只有一个,可能出现二义性,没有统一的标准
- C++中的异常必须有处理,如果没被处理,程序会调用terminate函数终止程序
- 如果捕获到的异常不想处理,可以继续向上抛出 throw
异常的关键子
- try 可能出现异常的地方写到 try中
- throw 抛出异常
- chtch 捕获异常
int Division(int a, int b)
{
if(b == 0)
{
throw -1;
}
}
void test()
{
int a = 10;
int b = 20;
try
{
Division(a, b);
}
catch(int)
{
throw;
cout<<"异常捕获int"<<endl;
}
catch(...)
{
cout<<"其他的异常..."<<endl;
}
}
自定义异常使用
class MyException
{
public:
void PrintError()
{
cout<<"自定义异常"<<endl;
}
}
int Division(int a, int b)
{
if(b == 0)
{
throw MyException();
}
}
void test()
{
int a = 10;
int b = 0;
try
{
Division(a, b);
}
catch(MyException e)
{
e.PrintError();
}
catch(...)
{
cout<<"其他的异常..."<<endl;
}
}
栈解旋
从try 开始起,到throw抛出异常前,栈上的数据都会被释放,释放的顺序与构造是相反的,整个过程称为栈解旋
#include <memory>
class Person
{
public:
Person();
~Person();
}
void test()
{
auot_ptr<Person>p(new Person);
unique_ptr<Person>p2(new Person);
}
异常的接口声明
void func() throw(int)
{
throw 1;
}
void func2() throw(int,double)
{
throw 1;
}
void func2() throw()
{
throw 1;
}
异常变量的生命周期
class MyException
{
public:
MyException()
{
cout<<"构造函数"<<endl;
}
MyException(const MyException &e)
{
cout<<"拷贝构造"<<endl;
}
~MyException()
{
cout<<"析构函数"<<endl;
}
}
void func()
{
throw MyException();
}
void test()
{
try
{
func();
}
catch(MyException &e)
{
cout<<" 自定义异常捕获"<<endl;
}
}
C++标准异常库
异常名称 | 描述 |
---|
exception | 所有标准异常类的父类 | bad_alloc | 当operator new and operator new[],请求分配内存失败时 | bad_exception | 这是个特殊的异常,如果函数的异常抛出列表里声明了bad_exception异常,当函数内部抛出了异常抛出列表中没有的异常,这是调用的unexpected函数中若抛出异常,不论什么类型,都会被替换为bad_exception类型 | bad_typeid | 使用typeid操作符,操作一个NULL指针,而该指针是带有虚函数的类,这时抛出bad_typeid异常 | bad_cast | 使用dynamic_cast转换引用失败的时候 | ios_base::failure | io操作过程出现错误 | logic_error | 逻辑错误,可以在运行前检测的错误 | runtime_error | 运行时错误,仅在运行时才可以检测的错误 |
logic_error的子类:
异常名称 | 描述 |
---|
length_error | 试图生成一个超出该类型最大长度的对象时,例如vector的resize操作 | domain_error | 参数的值域错误,主要用在数学函数中。例如使用一个负值调用只能操作非负数的函数 | out_of_range | 超出有效范围 | invalid_argument | 参数不合适。在标准库中,当利用string对象构造bitset时,而string中的字符不是’0’或’1’的时候,抛出该异常 |
runtime_error的子类:
异常名称 | 描述 |
---|
range_error | 计算结果超出了有意义的值域范围 | overflow_error | overflow_error 算术计算上溢 | underflow_error | 算术计算下溢 | invalid_argument | 参数不合适。在标准库中,当利用string对象构造bitset时,而string中的字符不是’0’或’1’的时候,抛出该异常 |
使用示例
#include<stdexcept>
class Person
{
public:
Person(int age)
{
if(age < 0 || age > 150)
{
throw out_of_range("年龄越界!");
}
this->mAge = age;
}
int mAge;
}
void test()
{
try
{
Person p(-10);
}
catch(exception &e)
{
cout<<e.what()<<endl;
}
}
|