开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
错误情况
在C++程序中出现错误有两种情况:
- 语法错误(编译错误):如变量未定义、括号不匹配、关键字拼写错误等等,这些错误在编译阶段是能够被识别出来的,由编译器发现并指出错误的位置和原因,帮助开发人员改正
- 运行时错误:如数组下标越界、内存不足等,这些错误不容易被开发人员发现也没办法被编译器发现,能够让程序运行但是会在运行时出现错误导致程序崩溃。那么对于这些错误我们需要引入异常处理机制进行解决,避免程序崩溃
C++的异常处理机制
异常处理基本思想:在执行一个函数的过程中发现异常,可以不用在本函数中立即处理,而是抛出异常,由函数的调用者直接或间接处理该异常
C++的异常处理机制由三个模块组成:try(检查)、throw(抛出)、catch(捕获)
- throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
- catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
- try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。
如果try块中程序段发现了异常则抛出异常,并依次尝试通过catch进行捕获,如果捕获成功则调用相应的函数处理短,如果捕获失败,则使用terminal终止程序
try{
// 可能抛出异常的语句;(检查)
} catch(类型名[形参名]){ //捕获特定类型的异常
//处理1;
} catch(类型名[形参名]){//捕获特定类型的异常
//处理2;
} catch (…){ //捕获所有类型的异常
}
C++的标准异常
- std::exception:所有标准C++异常的父类
- std::logic_error:逻辑错误(无效的参数、太长的string、数组越界)
- std::runtime_error:运行时错误(数据溢出)
可以通过这些类派生出自己的错误类型,尤其是对logic_error进行重载
例子
#include <iostream>
using namespace std;
double division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!";
}
return (a/b);
}
int main ()
{
int x = 50;
int y = 0;
double z = 0;
try {
z = division(x, y);
cout << z << endl;
}catch (const char* msg) {
cerr << msg << endl;
}
return 0;
}