小萌新的C++——异常

异常

什么是异常

非正常(警告,错误)

库发现异常,把异常抛出,库的用户处理异常;

异常处理机制

try(检查) -> throw(抛出) -> catch(捕获)
​
try
{
    //检查语句
    if(错误)
    {
        throw 异常
    }
}
catch(异常类型1)
{
    异常处理语句1;
}
...

what 打印异常信息

exception(异常基类)

所有标准异常的父类

逻辑异常(logic error)

length_error

试图生成一个超出该类型最大长度的对象

domain_error

参数的值域错误,主要用在数学函数中。

out_of_range

超出有效范围

invalid_argument

参数不合适

运行异常(runtime error)

range_error

计算结果超出了有意义的值域范围

overflow_error

算术计算上溢

underflow_error

算术计算下溢                

多种异常

eg

void convert(int *arr, int size, int n)
    throw(invalid_argument,out_of_range)
{
    if( (n <  0) || (n > size))
    {
        throw out_of_range("N,不在取值范围内,N太大了"); //超出范围异常
    }
    if (NULL == arr)
    {
        throw invalid_argument("arr,指针不能为空");   //无效参数
    }
    int i,j,temp;
    for(i = 0, j = n -1; i < j; i++, j--)
    {
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
int main()
{
    int arr[10] = {0,1,2,3,4,5,6,7,8,9};
    //捕获多种异常
try
    {
        convert(arr,10,-5);
    }
    catch (const logic_error &err) { //捕获所有的派生类异常
        cout << "Error:" << err.what() << endl;
    }
    for (int i = 0; i < 10; i ++)
    {
        cout << arr[i] << " ";
    }
    cout<< endl;

    return 0;
}

ie

自定异常

自定义异常类,通常从exception继承,自定义异常类跟标准异常类使用方法一致

eg:

#include <iostream>

using namespace std;

class MyError:public exception{ //继承exception类
public:
        MyError(const char *err) noexcept;  //noexcept:不会产生异常
        const char *what() const noexcept;  //noexcept:不会产生异常
private:
    const char *errString;
};

MyError::MyError(const char *err)noexcept :errString(err)
{

}
const char *MyError::what() const noexcept
{
    return errString;
}

int divException(int x, int y)
throw(MyError)
{
    if(0 == y)
    {
        throw MyError("除数为0");
    }
     return x/y;
}

int main()
{
    int result = 0;
    try {
        result = divException(10,5);
    } catch (const MyError &err) {
        cout << "MyError:" << err.what() << endl;
    }

    cout << result << endl;
    return 0;
}

ie:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值