异常是一种错误处理机制
异常处理机制是“出现了什么错误,该如何处理”
一、编译错误(语法异常)
二、运行时错误(异常)
1.抛出异常
使用关键字 throw 来抛出异常,表示程序运行时出现错误
语法: throw 表达式;
说明:当程序执行了throw语句后,程序流不再往下执行,从当前函数查找 异常处理语句。
如果异常没有被处理,则往上抛出(抛出给当前函数的调用者),直到被处理为止。
如果异常被操作系统捕获,则终止当前进程。
2.处理异常
使用关键字 try...catch ...语句来捕获和处理
try
{
//可能抛出(产生)异常的代码块
}
catch(异常类型1 形参)
{
处理异常
}
catch(异常类型n 形参)
{
处理异常
}
catch(...)... 代表任意类型的异常
{
处理异常
}
说明:
如果try中的语句抛出了异常,则程序流从try跳转到catch,进行异常类型匹配
如果匹配成功,则进入异常处理
如果匹配失败,则按顺序往下匹配
如果所有的catch都匹配失败,则继续往上抛出,直到被处理为止。(编译器自动调用系统的terminate接口直接终止程序。)
3、标准库的异常类型
C++标准库中提供了一组异常类型,表示各种各样常见的异常情况,定义于头文件 <stdexcept>
常见异常如:
std::logic_error
std::runtime_error //只有在运行时才能检测出的问题
std::out_of_range //范围越界
std::bad_alloc //内存分配失败
所有异常类型只定义了一个名为what的成员函数,该函数没有任何参数,
返回一个C风格的字符串 const char* 用于提供异常信息。
注意:
构造函数中可以抛出异常
普通的成员函数也可以抛出异常
析构函数 不能 抛出异常!析构函数默认就是noexcept的
如果一个函数绝对不抛出异常,可以在函数参数列表后加 noexcept 来进行说明。
noexcept是一种承诺,承诺该函数不抛出异常。
如果一个函数用noexcept说明了,然后又在函数内部抛出了异常,编译时会有警告,执行时,
如果调用了该函数,系统直接终止该进程。