【C++高阶(七)】C++异常处理的方式

小明 2025-04-29 22:20:31 4

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C++从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习C++

  🔝🔝


异常处理的方式

  • 1. 前言
  • 2. C语言处理异常的方式
  • 3. C++异常概念
  • 4. 异常的抛出和匹配原则
  • 5. 异常的重新抛出
  • 6. RAII思想在异常体系中的使用
  • 7. 自定义异常体系
  • 8. C++标准库的异常体系
  • 9. 总结以及拓展

    1. 前言

    C++有一套独立的异常处理机制,

    相信大家一定听说过try,catch这两

    个词,今天就来做详细的介绍

    本章重点:

    本篇文章着重讲解C++异常处理的方式,

    三个关键字,tyr,catch,throw,并且介绍异

    常的用法和自定义体系的异常以及智能指

    针在异常处理中的使用场景.其中,会复习

    C语言异常处理的方式


    2. C语言处理异常的方式

    最经典的处理方式:使用assert

    assert的缺陷:

    如果在代码中使用assert,则只在debug

    模式下有效,在release模式下会失效.并且

    只要有错误就会直接终止程序,这明显不符

    合实际,比如说在使用微信时,由于网络问题

    信息没发出去,这时直接将微信程序终止了,

    这样做会被乱棍打死!

    C语言还能用错误码返回异常信息

    错误码errno的缺陷:

    返回的错误码是一个数字,程序员还需

    去查表来得知这个错误码是什么意思,

    并且就算查找了错误码的信息,可能它

    说的不清楚,也不好看错误信息

    综上所述,C语言处理异常的方式还是

    不够完美,于是祖师爷写了一套自己的


    3. C++异常概念

    当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。

    • throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的
    • catch: 在您想要处理问题的地方,通过异常处理程序捕获异常.catch 关键字用于捕获异常
    • try: try 块中的代码标识将被激活的特定异常,它后面通常跟着一个或多个 catch 块。

      使用方法:

      try{
      	int a,b;
      	cin>>a>>b;
      	if(b == 0)
      		throw "除0错误"
      	cout
      	//......
      }
      
      	int a,b;
      	cinab;
      	if(b == 0)
      		throw "除0错误"
      	cout
      	//......
      }
      catch(string str)
      {
      	//......
      }
      throw "测试中";}
      void b(){a()}
      void c(){b()}
      int main()
      {
      	try{
      		c();
      	}
      	catch(string str)
      	{}
      
          // 当b == 0时抛出异常
      	if (b == 0)
      	  throw "除0错误!";
         else
         	  return ((double)a / (double)b);
      }
      void Func()
      {
      	int len, time;
      	cin  len  time;
      	cout //这个catch与throw相距最近,会优先到这儿
      	cout 
      	try {
      		Func();
      	}
      	catch (const char* errmsg) {
      		cout 
          // 当b == 0时抛出异常
      	if (b == 0)
      	  throw "除0错误!";
         else
         	  return ((double)a / (double)b);
      }
      void Func()
      {
      	int len, time;
      	cin  len  time;
      	cout //这个catch与throw相距最近,会优先到这儿
      	cout 
      	try {
      		Func();
      	}
      	catch (const char* errmsg) {
      		cout 
         cout
      	// 当b == 0时抛出异常
      	if (b == 0)
      	{
      		throw "Division by zero condition!";
      	}
      	return (double)a / (double)b;
      }
      void Func()
      {
      	// 这里可以看到如果发生除0错误抛出异常,另外下面的array没有得到释放。
      	// 所以这里捕获异常后并不处理异常,异常还是交给外面处理,这里捕获了再
      	// 重新抛出去。
      	int* array = new int[10];
      	try {
      		int len, time;
      		cin  len  time;
      		cout 
      		cout 
      	try
      	{
      		Func();
      	}
      	catch (const char* errmsg)
      	{
      		cout 
      	// 当b == 0时抛出异常
      	if (b == 0)
      	{
      		throw "Division by zero condition!";
      	}
      	return (double)a / (double)b;
      }
      void Func()
      {
      	shared_ptr
      		int len, time;
      		cin  len  time;
      		cout 
      	try
      	{
      		Func();
      	}
      	catch (const char* errmsg)
      	{
      		cout 
The End
微信