C++的异常处理一篇带你了解

目录
  • 一、背景
  • 二、C++ 异常处理
  • 三、抛出异常与捕获异常
  • 四、catch(...)的作用
  • 总结

一、背景

程序运行时常会碰到一些异常情况,例如:

  • 做除法的时候除数为 0;
  • 用 new 运算符动态分配空间时,空间不够导致无法分配;
  • 访问数组元素时,下标越界;打开文件读取时,文件不存在。

这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃。
所谓“处理”,可以是给出错误提示信息,然后让程序沿一条不会出错的路径继续执行;也可能是不得不结束程序,但在结束前做一些必要的工作,如将内存中的数据写入文件、关闭打开的文件、释放动态分配的内存空间等。

二、C++ 异常处理

C++ 引入了异常处理机制。

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

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

举个例子

#include <iostream>
#include <exception>
using namespace std;
int main () {
   try
	 {
		 throw 1;
		 throw "error";
	 }
	 catch (const char* str)
	 {
		 cout << str << endl;
	 }
	 catch (int i)
	 {
		 cout << i << endl;
	 }
}

运行结果

也可以自己定义异常类来进行处理:

#include <iostream>
#include <exception>
using namespace std;
//可以自己定义Exception
class myexception: public exception
{
	virtual const char* what() const throw()
	{
		return "My exception happened";
	}
}myex;
int main () {
	try
	{
		if(true)    //如果,则抛出异常;
			throw myex;
	}
	catch (exception& e)
	{
		cout << e.what() << endl;
	}
	return 0;
}

三、抛出异常与捕获异常

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

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

#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;
}

运行结果

四、catch(...)的作用

  catch(…)能够捕获多种数据类型的异常对象,所以它提供给程序员一种对异常对象更好的控制手段,使开发的软件系统有很好的可靠性。因此一个比较有经验的程序员通常会这样组织编写它的代码模块,如下:

void Func()
{
  try
  {
    // 这里的程序代码完成真正复杂的计算工作,这些代码在执行过程中
    // 有可能抛出DataType1、DataType2和DataType3类型的异常对象。
  }
  catch(DataType1& d1)
  {
  }
  catch(DataType2& d2)
  {
  }
  catch(DataType3& d3)
  {
  }
  catch(…)
  {
  }
}

例子

 double division(int a, int b)
 {
	 if (b == 0) {
		 throw "Division by zero condition!";
	 }
	 return (a / b);
 }
 int main() {
	 try
	 {
		 int res = division(10,0);
	 }
	 catch (...)
	 {
		 cout << " * ********" << endl;
	 }
     return 0;
}

参考:

C++异常处理(try catch throw)完全攻略

c++中try catch的用法

C++ 异常处理

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++常见异常处理原理及代码示例解析

    编程中常见的错误 程序的编译错误--比较好解决,主要是一些语法错误 程序的运行错误--产生因素较为复杂,如空间不够,下标越界,访问非法空间等. 异常是指程序运行时出现的不正常,可分为一下几类: CPU异常:如在计算过程中,出现除数为0的情况. 内存异常,如: 使用new或malloc申请动态内存但存储空间不够: 数组下标越界: 使用野指针.迷途指针读取内存: 设备异常,如: 无法打开文件,或文件损坏: 正在读取磁盘文件时挪动了文件或磁盘: 正在使用打印机但设备被断开: 正在使用的网络断线或阻塞:

  • C++异常处理入门(try和catch)

    目录 捕获异常 发生异常的位置 开发程序是一项"烧脑"的工作,程序员不但要经过长期的知识学习和思维训练,还要做到一丝不苟,注意每一个细节和边界.即使这样,也不能防止程序出错. 专家指出,长期作息不规律 + 用脑过度的危害很大,可能会诱发神经衰弱.失眠等疾病.我就是受害者之一,曾被失眠困扰了好几年,不但入睡困难,还容易早醒.程序员要注意劳逸结合,多去健身房,多跑步,多打球,多陪女朋友旅游等,千万不要熬夜,以为深夜写代码效率高,这样会透支年轻的身体. 程序的错误大致可以分为三种,分别是语法

  • 详细分析C++ 异常处理

    异常是程序在执行期间产生的问题.C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作. 异常提供了一种转移程序控制权的方式.C++ 异常处理涉及到三个关键字:try.catch.throw. throw: 当问题出现时,程序会抛出一个异常.这是通过使用 throw 关键字来完成的. catch: 在您想要处理问题的地方,通过异常处理程序捕获异常.catch 关键字用于捕获异常. try: try 块中的代码标识将被激活的特定异常.它后面通常跟着一个或多个 catch 块. 如果有一个

  • 详解C++异常处理(try catch throw)完全攻略

    程序运行时常会碰到一些异常情况,例如: 做除法的时候除数为 0: 用户输入年龄时输入了一个负数: 用 new 运算符动态分配空间时,空间不够导致无法分配: 访问数组元素时,下标越界:打开文件读取时,文件不存在. 这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃. 所谓"处理",可以是给出错误提示信息,然后让程序沿一条不会出错的路径继续执行:也可能是不得不结束程序,但在结束前做一些必要的工作,如将内存中的数据写入文件.关闭打开的文件.释放动态分配的内存空间等. 一发现异常情况就

  • C/C++中异常处理详解及其作用介绍

    目录 概述 异常处理 异常处理机制 函数声明指定异常 练习 案例一 案例二 概述 作为一名专业写 Bug, 编程一天改 bug 一周的程序媛. 学会异常处理是非常重要的. 我们不仅要考虑没有错误的理想情况, 更要考虑存在错误时的情况. Debug 可以帮助我们尽快发现错误, 消除错误. 错误类别: 语法错误 运行错误 逻辑错误 异常处理 设计程序时, 事先分析程序运行时可能出现的各种意外情况, 定制出相应的处理方法. 异常处理指对运行时出现的差错以及其他例外情况的处理. 没有异常处理程序时, 运

  • C++中try throw catch异常处理的用法示例

    前言 今天在开发过程中调用一个库函数结果库函数有throw操作,当前代码没有对throw进行捕获操作,导致进程在main 函数中捕获到异常导致进程crash.所以借此记录下c++关于try,throw,catch的用法. 程序运行时常会碰到一些异常情况,例如: 做除法的时候除数为 0: 用户输入年龄时输入了一个负数: 用 new 运算符动态分配空间时,空间不够导致无法分配: 访问数组元素时,下标越界:打开文件读取时,文件不存在. 这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃. 所谓

  • C++的异常处理一篇带你了解

    目录 一.背景 二.C++ 异常处理 三.抛出异常与捕获异常 四.catch(...)的作用 总结 一.背景 程序运行时常会碰到一些异常情况,例如: 做除法的时候除数为 0: 用 new 运算符动态分配空间时,空间不够导致无法分配: 访问数组元素时,下标越界:打开文件读取时,文件不存在. 这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃. 所谓"处理",可以是给出错误提示信息,然后让程序沿一条不会出错的路径继续执行:也可能是不得不结束程序,但在结束前做一些必要的工作,如将内存

  • 一篇带你解析入门LongAdder源码

    1.LongAdder由来 LongAdder类是JDK1.8新增的一个原子性操作类.AtomicLong通过CAS算法提供了非阻塞的原子性操作,相比受用阻塞算法的同步器来说性能已经很好了,但是JDK开发组并不满足于此,因为经常搞并发的请求下AtomicLong的性能是不能让人接受的. 如下AtomicLong 的incrementAndGet的代码,虽然AtomicLong使用CAS算法,但是CAS失败后还是通过无限循环的自旋锁不多的尝试,这就是高并发下CAS性能低下的原因所在.源码如下: p

  • 一篇带你了解C语言--位操作详情

    目录 二进制数.位和字节 二进制整数 有符号整数 二进制浮点数介绍 八进制和十六进制 C按位运算符 按位逻辑运算符 二进制反码或按位取反:~ 按位与:& 按位或:| 按位异或:^ 用法:掩码 用法:打开位(设置位) 用法:关闭位(清空位) 用法:切换位 用法:检查位的值 移位运算符 左移:<< 右移:>> 总结 在C语言中,是可以单独操控变量中的位的.因为C在提供高级语言便利的同时,还能在为汇编语言所保留的级别上工作. 二进制数.位和字节 在我们日常生活中通常使用的十进制.

  • 一篇带你入门Java垃圾回收器

    目录 1 垃圾回收算法 1-1 标记清除算法 算法思想 1-2 标记整理算法 1-3 复制算法 2 JVM分代回收算法 2-1 概述 2-2 分代垃圾回收示例 2-3 分代垃圾回收的总结 对象首先分配在伊甸园区域 2-5 垃圾回收案例分析 2 垃圾回收器 2-1 垃圾回收器概述 2-2 串行垃圾回收器 2-3 吞吐量优先的垃圾回收器 2-4 响应时间优先的垃圾回收器(CMS垃圾回收器) 总结: 第一阶段:串行垃圾回收器:jdk1.3.1之前Java虚拟机仅仅只支持Serial收集器 第二阶段:并

  • 一篇文章带你搞懂Vue虚拟Dom与diff算法

    前言 使用过Vue和React的小伙伴肯定对虚拟Dom和diff算法很熟悉,它扮演着很重要的角色.由于小编接触Vue比较多,React只是浅学,所以本篇主要针对Vue来展开介绍,带你一步一步搞懂它. 虚拟DOM 什么是虚拟DOM? 虚拟DOM(Virtual   Dom),也就是我们常说的虚拟节点,是用JS对象来模拟真实DOM中的节点,该对象包含了真实DOM的结构及其属性,用于对比虚拟DOM和真实DOM的差异,从而进行局部渲染来达到优化性能的目的. 真实的元素节点: <div id="wr

  • 一篇文章带你从零快速上手Rollup

    前言 项目中一直用的都是webpack,前一段需要开发几个类库供其他平台使用,本来打算继续用webpack的,但感觉webpack用来开发js库,不仅繁琐而且打包后的文件体积也比较大.正好之前看vue源码,知道vue也是通过rollup打包的.这次又是开发类库的,于是就快速上手了rollup. 本篇文章是我有了一定的项目实践后,回过来给大家分享一下如何从零快速上手rollup. 什么是rollup? 系统的了解rollup之前,我们先来简单了解下What is rollup? 关于rollup的

  • ssm项目改造spring boot项目完整步骤

    目录 添加依赖 添加启动类 拷贝项目代码 配置数据库连接池 添加依赖 连接池的自动配置方式 配置 Druid 连接池 集成 MyBatis 添加依赖 配置 Mapper 对象 MyBatis配置属性 事务管理 添加依赖 注解方式 配置切换代理 测试验证 集成 Web 添加依赖 修改端口 目录结构 静态资源的一些处理 前端控制器映射路径配置 集成 Thymeleaf 添加依赖 相关配置 修改模板文件 统一异常处理 框架自带方式 控制器增强器方式 添加注册多个拦截器 系统日志 为什么要用日志 Spr

  • 作为PHP程序员应该了解MongoDB的五件事

    2010年应该被人们记住,因为SQL将在这一年死去.这一年关系数据库行将就木,这一年开发者发现他们再不需要长时间辛苦的构造列或者表格来存放数据.2010年将是文档型数据库的起始年.尽管这样的势头已经持续多年,现在才是一个更多,更广泛的文档型数据库出现的年代.从基于云计算的Amazon到Google,大量开源工具,以及随之诞生的CouchDB和MongoDB.那么什么是MongoDB?下面有五件事是PHP开发者应该了解的:1. MongoDB是一个单独的服务器;2. MongoDB是基于文档,而不

  • Android画板开发之基本画笔功能

    一.简介 这是画板系列的第一篇,一步步开始,从简单的画板,到功能稍微齐全一点的画板,例如基本画笔.橡皮擦.背景.文字.撤销.反撤销.保存等 这篇带大家实现一个最简单的画板,前提是需要对自定义View有一定的了解. 用的是kotlin语言 二.实现 分析如何实现: 定义了画笔和Path,然后在触摸屏幕的时候,手指一边移动一边进行path的滑动,绘制.这就完成了一个最简单的画笔功能. 下面几十行代码完成这个 class TPView(context: Context,attr:AttributeSe

  • 解析ConcurrentHashMap: put方法源码分析

    上一章:预热(内部一些小方法分析) put()方法是并发HashMap源码分析的重点方法,这里涉及到并发扩容,桶位寻址等等- JDK1.8 ConcurrentHashMap结构图: 1.put方法源码解析 // 向并发Map中put一个数据 public V put(K key, V value) { return putVal(key, value, false); } // 向并发Map中put一个数据 // Key: 数据的键 // value:数据的值 // onlyIfAbsent:

随机推荐