C++异常介绍与自定义异常

2023-11-03

C++异常处理提供了一种在程序运行期间处理运行时错误的方法。通过使用异常处理,您可以更清晰地分隔正常代码和处理错误的代码。C++异常处理涉及到三个关键词:try, catchthrow

  1. throw:当问题出现时,程序会“抛出”一个异常。这是由 throw 关键词完成的。

  2. catch:在您希望处理问题的地方,通过 catch 语句块捕获异常。

  3. trytry 语句块用于放置可能引发异常的代码。

基本示例

#include <iostream>

int main() {
    try {
        int divisor = 0;
        int dividend = 10;

        if (divisor == 0) {
            throw "Division by zero condition!";
        }

        int result = dividend / divisor;
        std::cout << "Result: " << result << std::endl;

    } catch (const char* e) {
        std::cerr << "Error: " << e << std::endl;
    }

    return 0;
}

在上面的代码中,我们尝试通过零进行除法,这显然是不允许的。因此,我们抛出一个异常,然后在 catch 语句块中捕获并处理它。

使用标准异常

C++ STL中提供了一系列标准的异常类,例如 std::runtime_error, std::out_of_range, std::invalid_argument 等。以下是使用标准异常的示例:

#include <iostream>
#include <stdexcept>

int divide(int dividend, int divisor) {
    if (divisor == 0) {
        throw std::runtime_error("Division by zero condition!");
    }
    return dividend / divisor;
}

int main() {
    try {
        int result = divide(10, 0);
        std::cout << "Result: " << result << std::endl;

    } catch (const std::runtime_error& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }

    return 0;
}

在这个示例中,我们使用 std::runtime_error 来代替字符串异常,并使用 e.what() 方法打印异常消息。

总之,异常处理提供了一种管理程序错误的方法,它允许开发人员将错误处理逻辑与主要的程序逻辑分离开来,使代码更加清晰和有组织。

自定义异常

在C++中,自定义异常通常意味着定义一个新的异常类。这个类通常继承自标准库的异常类,例如 std::exception。以下是一个如何自定义异常的步骤:

  1. 定义异常类:创建一个新的类,继承自 std::exception 或其他相关的异常类。

  2. 提供异常消息:覆盖 what() 函数,这样当异常被捕获并处理时,可以提供一个描述性的错误消息。

  3. 抛出自定义异常:在代码的适当位置使用 throw 关键字抛出自定义的异常。

  4. 捕获自定义异常:使用 try-catch 语句块来捕获和处理异常。

以下是一个简单的示例:

#include <iostream>
#include <exception>

// 1. 定义异常类
class MyException : public std::exception {
private:
    std::string message;
public:
    MyException(const std::string& msg) : message(msg) {}

    // 2. 提供异常消息
    virtual const char* what() const noexcept override {
        return message.c_str();
    }
};

int main() {
    try {
        // 某些条件触发异常
        bool condition = true;
        if (condition) {
            // 3. 抛出自定义异常
            throw MyException("This is a custom exception");
        }
    } catch (const MyException& e) {  // 4. 捕获自定义异常
        std::cerr << "Caught exception: " << e.what() << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "Caught standard exception: " << e.what() << std::endl;
    }

    return 0;
}

上述代码中,我们定义了一个名为 MyException 的自定义异常类,该类提供了一个描述性的错误消息。在 main 函数中,我们抛出了这个异常,并在一个 try-catch 语句块中捕获和处理它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++异常介绍与自定义异常 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • ffmpeg 视频解码一

    1 ffmpeg 视频解码一 2 ffmpeg 视频解码二 3 ffmpeg 音频解码一 4 ffmpeg 音频解码二 5 ffmpeg 音视频解码 6 ffmpeg 视频编码一 7 ffmpeg 视频编码一 精简版 8 ffmpeg 视频
  • PyTorch深度学习实战(15)——迁移学习

    PyTorch深度学习实战 15 迁移学习 0 前言 1 迁移学习 1 1 迁移学习基本概念 1 2 迁移学习的重要性 1 3 ImageNet 1 4 迁移学习流程 2 VGG16 架构 3 使用预训练 VGG16 模型实现猫狗分类 小结
  • Compose 获取当前屏幕方向是横屏还是竖屏

    从本地配置读取方向属性 共三个值 LocalConfiguration current orientation 对应的属性值在android content res Configuration类里 public static final i
  • 省市区三级联动 thinkphp5(附json文件)

    只怪自己学艺不精 基础不牢固 写这个弄了好久时间 数组那里有点烦 绕来绕去emmm index php文件
  • 企业怎么管理自己固定资产的

    在当今的商业世界中 企业的固定资产是其生存和发展的基础 然而 仅仅关注这些有形的资产 如土地 建筑和设备 可能会忽视企业最宝贵的资产 人力资源和知识 因此 成功的企业不仅需要管理好自己的有形资产 更要善于管理自己的无形资产 有效的固定资产管
  • Flutter 利用OverlayEntry实现Toast(进阶)

    Flutter 利用OverlayEntry实现Toast 进阶
  • 虚拟机Ubuntu20.04系统,换成清华源的步骤

    虚拟机 Ubuntu操作系统 换成清华源 1 要先安装好VMware Tools工具 方便以后复制粘贴 2 先去清华大学镜像源官网找到自己安装的操作系统对应的镜像 网站如下 https mirrors tuna tsinghua edu c
  • 什么是红黑树?

    文章目录 红黑树的特性 变色 左旋转 右旋转 插入新的节点五种不同的局面 为了解决二叉树多次插入新的节点导致不平衡的问题 红黑树应运而生了 红黑树的特性 结点是红色或黑色 根结点是黑色 每个叶子结点都是黑色的空结点 NIL结点 每个红色结点
  • 基于FFT和深度置信网络DBN的轴承故障诊断——Matlab 实现

    基于FFT和深度置信网络DBN的轴承故障诊断 Matlab 实现 近年来 轴承故障诊断一直是机械领域研究的热点之一 针对轴承故障 结合FFT 快速傅里叶变换 和深度置信网络DBN 可以实现快速 准确地诊断轴承故障 本文将详细介绍该方法实现的
  • #2013蓝桥杯-4.黄金连分数--------看了解析(高精度!)

    唉 标准答案没看懂 找到个可以看懂的答案分析一波 题目描述 黄金分割数0 61803 是个无理数 这个常数十分重要 在许多工程问题中会出现 有时需要把这个数字求得很精确 对于某些精密工程 常数的精度很重要 也许你听说过哈勃太空望远镜 它首次
  • ASP.NET Web Pages基础知识---从文本文件中读取并显示数据

    在您的网站上 如果没有 App Data 文件夹 请创建一个 在 App Data 文件夹中 创建一个名为 Persons txt 的文件 添加以下内容到文件中 Persons txt George Lucas Steven Spielbe
  • BIN文件和HEX文件区别

    BIN文件和HEX文件区别 参考 https blog csdn net spdian article details 52963467 https zhidao baidu com question 180988134632085124
  • JavaScript强化教程——canvas

    本文为 H5EDU 机构官方 HTML5培训 教程 主要介绍 JavaScript强化教程 canvas 使用 strokeText 使用 Arial 字体在画布上绘制一个高 30px 的文字 空心 JavaScript var c doc
  • 【Clion+CubeMX开发STM32】(一)安装配置Clion

    目录 前期准备 安装配置环境 安装汉化Clion 安装MinGW 验证MinGW 安装arm none eabi gcc 验证arm none eabi gcc 安装openOCD CubeMX 前期准备 下载安装以下软件 Clion ST
  • OSS上传文件后下载报错 NoSuchKey: The specified key does not exist.

    成功上传excel到阿里云oss后 再拿返回的完整url http 桶名称 地域节点 订单 2022 09 03 智慧云店 订单管理 导入订单 1662193298950382 xlsx 下载文件 出现如下报错信息
  • 时间序列预测和无监督学习附Matlab代码实例

    时间序列预测和无监督学习附Matlab代码实例 时间序列是指按时间顺序排列的数据集合 例如气象数据 股票数据等 在实际应用中 我们需要对这些数据进行预测和分析 以便做出正确的决策 而无监督学习则是一种机器学习技术 无需人工标注数据即可自动学
  • 基于SSM的化妆品配方及工艺管理系统设计与实现

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • Android Studio Sqlite的增删改查

    MySQLiteOpenHelper java import android content Context import android database sqlite SQLiteDatabase import android data
  • 基于Vue的前端权限管理

    前端权限控制的思路主要分为以下几个方向 1 菜单的控制 导航侧边栏 登录请求中得到后端返回的权限数据 前端根据权限数据动态展示对应菜单 点击菜单才能查看对应界面 store js import Vue from vue import Vue
  • C++异常介绍与自定义异常

    C 异常处理提供了一种在程序运行期间处理运行时错误的方法 通过使用异常处理 您可以更清晰地分隔正常代码和处理错误的代码 C 异常处理涉及到三个关键词 try catch 和 throw throw 当问题出现时 程序会 抛出 一个异常 这是