Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何用c++实现异常处理

如何用c++实现异常处理

作者头像
爱学iOS的小麦子
发布于 2023-05-09 12:51:48
发布于 2023-05-09 12:51:48
56400
代码可运行
举报
文章被收录于专栏:iOS开发大全iOS开发大全
运行总次数:0
代码可运行

⭐本文介绍⭐

异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。

异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw

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

如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。使用 try/catch 语句的语法如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try
{
   // 保护代码
}catch( ExceptionName e1 )
{
   // catch 块
}catch( ExceptionName e2 )
{
   // catch 块
}catch( ExceptionName eN )
{
   // catch 块
}

如果 try 块在不同的情境下会抛出不同的异常,这个时候可以尝试罗列多个 catch 语句,用于捕获不同类型的异常。

​​抛出异常​​

您可以使用 throw 语句在代码块中的任何地方抛出异常。throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。

以下是尝试除以零时抛出异常的实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
double division(int a, int b)
{
   if( b == 0 )
   {
      throw "Division by zero condition!";
   }
   return (a/b);
}

​​捕获异常​​

catch 块跟在 try 块后面,用于捕获异常。您可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try
{
   // 保护代码
}catch( ExceptionName e )
{
  // 处理 ExceptionName 异常的代码
}

上面的代码会捕获一个类型为 ExceptionName 的异常。如果您想让 catch 块能够处理 try 块抛出的任何类型的异常,则必须在异常声明的括号内使用省略号 ...,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try
{
   // 保护代码
}catch(...)
{
  // 能处理任何异常的代码
}

下面是一个实例,抛出一个除以零的异常,并在 catch 块中捕获该异常。

​​实例​​

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;
}

由于我们抛出了一个类型为 const char* 的异常,因此,当捕获该异常时,我们必须在 catch 块中使用 const char*。当上面的代码被编译和执行时,它会产生下列结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Division by zero condition!

​​C++ 标准的异常​​

C++ 提供了一系列标准的异常,定义在  中,我们可以在程序中使用这些标准的异常。它们是以父子类层次结构组织起来的,如下所示:

下表是对上面层次结构中出现的每个异常的说明:

异常

描述

std::exception

该异常是所有标准 C++ 异常的父类。

std::bad_alloc

该异常可以通过 new 抛出。

std::bad_cast

该异常可以通过 dynamic_cast 抛出。

std::bad_exception

这在处理 C++ 程序中无法预期的异常时非常有用。

std::bad_typeid

该异常可以通过 typeid 抛出。

std::logic_error

理论上可以通过读取代码来检测到的异常。

std::domain_error

当使用了一个无效的数学域时,会抛出该异常。

std::invalid_argument

当使用了无效的参数时,会抛出该异常。

std::length_error

当创建了太长的 std::string 时,会抛出该异常。

std::out_of_range

该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator。

std::runtime_error

理论上不可以通过读取代码来检测到的异常。

std::overflow_error

当发生数学上溢时,会抛出该异常。

std::range_error

当尝试存储超出范围的值时,会抛出该异常。

std::underflow_error

当发生数学下溢时,会抛出该异常。

​​定义新的异常​​

您可以通过继承和重载 exception 类来定义新的异常。下面的实例演示了如何使用 std::exception 类来实现自己的异常:

​​实例​​

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
#include <exception>
using namespace std;
 
struct MyException : public exception
{
  const char * what () const throw ()
  {
    return "C++ Exception";
  }
};
 
int main()
{
  try
  {
    throw MyException();
  }
  catch(MyException&amp; e)
  {
    std::cout << "MyException caught" << std::endl;
    std::cout << e.what() << std::endl;
  }
  catch(std::exception&amp; e)
  {
    //其他的错误
  }
}

这将产生以下结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MyException caught
C++ Exception

在这里,what() 是异常类提供的一个公共方法,它已被所有子异常类重载。这将返回异常产生的原因。

🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++ 异常处理
异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。
C语言与CPP编程
2020/12/02
1.2K0
C++ 异常处理
【c++】异常
异常是处理错误的一种方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数直接或间接的调用者处理这个错误
用户11029103
2025/02/07
1260
【c++】异常
C++异常处理
异常是一个程序执行过程中出现的问题。C++ 异常是对程序运行过程中产生的例外情况作出的响应,比如试图除以零。
软件架构师Michael
2023/08/20
2780
【C++航海王:追寻罗杰的编程之路】异常——错误处理方式之一
在C++编程中,异常处理是一种重要的技术,用于处理程序在运行时可能出现的错误或意外情况。异常是指在程序执行过程中发生的某种不正常的情况,例如除以零、内存访问错误或无效的输入等。传统的错误处理方式通常涉及使用错误代码或返回特殊值来指示问题,但这种方式可能会导致代码混乱、繁琐,并且容易被忽略或处理不当。
枫叶丹
2024/06/04
1070
【C++航海王:追寻罗杰的编程之路】异常——错误处理方式之一
【C++高阶】深入理解C++异常处理机制:从try到catch的全面解析
前言:在编程的浩瀚宇宙中,C++以其卓越的性能、强大的灵活性和对底层硬件的直接控制而著称,是无数开发者心中的瑰宝。然而,在追求高效与极致的路上,错误处理与异常管理往往成为不可忽视的重要环节。C++通过引入异常处理机制,为开发者提供了一套强大而灵活的工具,以优雅地应对程序执行过程中可能遇到的各种异常情况,从而确保程序的健壮性和可靠性
Eternity._
2024/08/09
1.1K0
【C++高阶】深入理解C++异常处理机制:从try到catch的全面解析
项目中你会用C++异常处理吗?
在 C++ 中,异常处理是一种用于处理程序运行过程中发生的错误或异常情况的机制。当程序出现异常情况时,可以使用异常处理机制来捕获、传递和处理异常,以保证程序的稳定性和可靠性。
Linux兵工厂
2024/04/01
2140
项目中你会用C++异常处理吗?
【C++】异常之道,行者无疆:解锁 C++ 的异常捕获哲学
C语言中的 strerror 将参数对应 errno 的错误信息的字符串返回。errno 是一个全局变量,当使用标准库的函数发生错误时,就会将对应的的错误码放到 errno 中,每个错误码对应着不同的错误信息,strerror 就可以将错误码对应的字符串返回。 以下为错误码 0~10 对应的信息:
HZzzzzLu
2024/12/26
2790
【C++】异常之道,行者无疆:解锁 C++ 的异常捕获哲学
【c++】c++异常&&c++的异常处理详解
实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误
用户10925563
2024/08/06
1670
【c++】c++异常&&c++的异常处理详解
C++异常处理机制
实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。
南桥
2024/09/20
990
C++异常处理机制
[C++] 异常
异常机制是一种重要的错误处理方法,可以帮助程序在运行时检测并处理问题,从而提高程序的可靠性和可维护性。C++异常机制的核心思想是:将错误检测和错误处理分离,从而让程序结构更清晰。
DevKevin
2024/11/17
820
[C++] 异常
【C++进阶学习】第十二弹——C++ 异常处理:深入解析与实践应用
1. 异常是通过抛出对象来激活的,该对象的类型决定了应该激活那个catch的处理代码
GG Bond1
2024/08/09
1540
【C++进阶学习】第十二弹——C++ 异常处理:深入解析与实践应用
C++异常
注:实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误
用户9645905
2022/11/30
7240
C++异常
C++异常的介绍和分析
C++11:异常 1.C语言传统的处理错误的方式 与 C++的对比 传统的错误处理机制: 终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。 返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码 放到errno中,表示错误 C 标准库中setjmp和longjmp组合。这个不是很常用,了解一下 实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。 c++处理方式 使
雪芙花
2022/10/31
8420
C++异常的介绍和分析
C++自定义异常案例
C++ 在 <exception> 中提供了一系列标准的异常,我们可以用在我们的程序中。这些异常使用父-子分层结构展示如下:
软件架构师Michael
2023/08/20
3230
C++:异常
异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。
二肥是只大懒蓝猫
2023/03/30
7230
C++:异常
C++:异常
实际中 C 语言基本都是使用返回 错误码 的方式处理错误,部分情况下使用终止程序处理非常严重的
啊QQQQQ
2024/11/19
800
C++:异常
C++异常
基于以上问题,C++衍生了一种新的处理错误的方式。异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。
梨_萍
2023/05/14
4490
C++异常
【C++高阶】:异常详解
🧩·C++针对上面的不足,引入了异常的概念,不会终止程序,并且会将错误信息详细介绍。
IsLand1314
2024/10/15
1530
【C++高阶】:异常详解
【C++修炼之路】31.异常
异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。
每天都要进步呀
2023/10/16
2440
【C++修炼之路】31.异常
C++ 异常处理深入探讨,一文打通任督二脉!
 则将调用并退出程序。 在 c + + 中,可能会引发任何类型,但是,建议引发直接或间接从 
Lion 莱恩呀
2025/04/18
740
C++ 异常处理深入探讨,一文打通任督二脉!
相关推荐
C++ 异常处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验