程序自定义exception

本文讨论了在C++程序开发中,如何合理选择异常和错误码来传递错误信息,强调了异常在低频错误和库代码中的优势,以及如何实现自定义异常的what()方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 C++程序开发的时候,对于某些操作(特别是开发库),最好以exception方式实现异常的展现。当然,也有很多地方推荐使用错误码的方式返回的,错误码会带来两个问题:

    1:增加函数参数,是有相应系统开销的

     2:需要检查错误码,很多人没有检查错误码的习惯,或者后续接收的人不习惯仔细检查错误码。

当然,也区分使用场景,如果错误发生比较频繁,那肯定错误码方式更加合适,反之,异常不常发生,异常更加合适(异常不发生,系统零开销,一旦发生以上可能导致时间和内存空间的巨大消耗),这个就看实际开发过程中对于异常发生概率的评估了。

     现在弄一个示例来说明如何实现自定义异常,上代码:

#include <iostream>
#include <exception>
using namespace std;

class MyClass
{

};

struct MyException : public exception {
    string text;
	MyException(const string& message):text(message){}
    //....
};

double process(int a, int b) {

   MyClass mc;
   if( b <= 0 ) {

        MyException mexp("argument b mush be greater than 0");
        throw mexp;
   }
   
   return static_cast<double>(a)/b;
}

int main() {
   try {

      process(10,0);
      
   } catch(MyException& e) {

      std::cout << "MyException caught" << std::endl;
      std::cout << e.what() << std::endl;
	
   } catch(std::exception& e) {      
      std::cout << "std::exception" << e.what() << std::endl;
      
   } catch(...)
   {

   }
   
}

上结果:

cegncn@cegncn-virtual-machine:~/boolan/LiJianZhong/day-3$ g++ exception.cpp 
cegncn@cegncn-virtual-machine:~/boolan/LiJianZhong/day-3$ ./a.out 
MyException caught
std::exception

如上,看上去,为啥会打印:
std::exception

实际并不是调用了 catch(std::exception& e),而是:std::cout << e.what() << std::endl;

导致的打印信息,如何实现自己的错误信息呢,修改下struct MyException 如下:

struct MyException : public exception {
    string text;
	MyException(const string& message):text(message){}
    //....
	const char* what() const noexcept override {
        return text.c_str();
    }
};

如此修改后,结果:

cegncn@cegncn-virtual-machine:~/boolan/LiJianZhong/day-3$ g++ exception.cpp 
cegncn@cegncn-virtual-machine:~/boolan/LiJianZhong/day-3$ ./a.out 
MyException caught
argument b mush be greater than 0

综上:

1:合理选择异常和错误码方式实现错误信息传递

2:对于发生频率不高的异常,如内存不足,概率不高,建议异常

3:对于库代码,异常也是非常不错选择,因为异常可以传递详细错误信息,虽然错误码也可以,但需要实现专门的错误码转换函数,挺麻烦的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值