C++捕获异常

163 阅读3分钟

启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情

在编程过程当中,大部分接触的是如何写好代码,但是不可避免的是错误的发生,我们把由于语法或者逻辑错误导致的程序编译失败或者运行中断叫做异常,注意这里要讨论的是异常,不是布尔值的false。

C++标准异常

和其他语言一样,在c++当中也定义了一些常见的错误类型,定义这些类可以让开发者更加明了的处理已经发生的错误,所以很有必要了解一下C++标准的异常,最常用的异常类型被放在了stdexcept头文件当中。

异常类描述
exception该异常是所有标准 C++ 异常的父类,自后自定义错误可以考虑使用这个类
bad_exception这在处理 C++ 程序中无法预期的异常时非常有用。
runtime_error理论上不可以通过读取代码来检测到的异常,只有在运行的时候才可以检测到的错误。
range_error运行错误,声音的结果超出了意义值域的范围
out_of_range逻辑错误,使用一个超出器有效范围的值
underflow_error计算下溢
overflow_error计算上溢
logic_error程序逻辑错误
domain_error参数对应的结果值不存在
invalid_argument无效的参数
length_error超出类型最大长度错误。

c++引发异常

实际在工作当中,由的错误是开发者不知道的情况下出现的,但有一部分是由开发者自己引发的,引发异常的目的很简单,就是为了让程序停下来,防止错误的输入输出导致更大的问题比如:删除文件的路径发现是计算机的根路径,除法运算被除数是0等等,这些很明显的错误,当遇到了之后,就可以通过C++提供的throw来引发错误。

int num1 = 0;
int num2 = 2;
if(num1 == 0){
    throw -1; //如果被除数为0就返回-1错误
}else{
    int num3 = num2/num1;
}

这里就是在num等于0的时候引发错误,防止程序执行下去。

C++捕获异常

那么上面展示了常见的异常,在日常编写代码的过程当中需要编写一些预防性的代码在可能出错的地方,比如用户输入的部分(个人觉得,作为一个程序员,绝对不要相信程序的输入部分,不论是用户输入还是上下游数据对接,一定要做好日志和判断,我之前有个朋友吧,就老不注意,自然,代码经常出现一些奇奇怪怪的错误。),C++提供了try catch语句进行错误的捕获防御,提前声明错误发生的处理方式。

#include <iostream>
#include <stdexcept>
using namespace std;
​
int main(){
​
    int num1 = 0;
    int num2 = 2;
    try{
        if(num1 == 0){
           throw -1; //如果被除数为0就返回-1错误
        }else{
           int num3 = num2/num1;
        }
    } catch (int err){ //使用int类型的err接收-1
       if(err == -1){
           cout << "error: line 12 " << err << " 被除数不可以为0"<< endl; //对错误进行具体的处理
       }
    }
​
    return 0;
}

这段代码对错误进行了错误,当然处理的方式也很粗糙,就是给出了提示,个人建议,一般情况下捕获异常后给出的提示会出现在日志等关键的地方,所以,开发者可以加上错误发生的行号,或者具体错误的原因,详细的报错会提高自己日志的价值。

最后还是请各位大佬多多指点。