iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一篇文章带你入门C++的异常处理
  • 649
分享到

一篇文章带你入门C++的异常处理

2024-04-02 19:04:59 649人浏览 独家记忆
摘要

目录一、背景二、c++ 异常处理三、抛出异常与捕获异常四、catch(...)的作用总结一、背景 程序运行时常会碰到一些异常情况,例如: 做除法的时候除数为 0;

一、背景

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

  • 做除法的时候除数为 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++ 异常处理

总结

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

--结束END--

本文标题: 一篇文章带你入门C++的异常处理

本文链接: https://www.lsjlt.com/news/135535.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一篇文章带你入门C++的异常处理
    目录一、背景二、C++ 异常处理三、抛出异常与捕获异常四、catch(...)的作用总结一、背景 程序运行时常会碰到一些异常情况,例如: 做除法的时候除数为 0; ...
    99+
    2024-04-02
  • 一篇文章带你入门Java Script
    目录概述特点和Java的区别弱类型语言强类型语言书写位置数组函数JS中的自定义对象(扩展内容)Object形式的自定义对象JS中的事件常用的事件:动态注册基本步骤:DOM模型总结概述...
    99+
    2024-04-02
  • 一篇文章带你了解C++中的异常
    目录异常抛出异常基本操作自定义的异常类栈解旋异常接口声明异常变量的生命周期异常的多态c++的标准异常库编写自己的异常类总结异常 在c语言中,对错误的处理总是两种方法: 1,使用整型的...
    99+
    2024-04-02
  • 一篇文章带你入门C语言:数组
    目录数组一维数组初始化使用总结:内存存储二维数组创建初始化数组越界问题数组作函数参数应用实例总结数组 一维数组 创建 定义 数组是一组相同类型的元素的集合。那数组的语法形式: t...
    99+
    2024-04-02
  • 一篇文章带你深入了解Java异常
    目录一.初识异常1.常见的异常类型<1>除以0<2>数组下标越界<3>访问null对象2.防御式编程<1>LBYL<2>E...
    99+
    2024-04-02
  • 一篇文章带你入门C语言:函数
    目录函数定义库函数定义介绍Example 1 strcpyExample 2 memset自定义函数Example 1Example 2 两数交换链式访问Example 1函数声明函...
    99+
    2024-04-02
  • 一篇文章带你入门java代理模式
    目录Java设计模式-代理模式什么是代理模式?代理模式小结:应用实例:使用场景:总结Java设计模式-代理模式 什么是代理模式? 在代理模式(Proxy Pattern)中,一个类代...
    99+
    2024-04-02
  • 一篇文章带你入门Java变量
    目录引言概念变量的四个基本属性如何定义变量如何使用变量变量的特点总结引言 ♀ 小AD:明哥,我终于出了这口恶气了。 ♂ 明世隐:打爽了是吧。 ♀ 小AD:那必须的,打十盘我赢九盘,...
    99+
    2024-04-02
  • 一篇文章带你入门Java继承
    目录Java中继承什么是继承:为什么要用继承:学习总结:继承关键字:extends总结Java中继承 什么是继承: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实...
    99+
    2024-04-02
  • 一篇文章带你入门java泛型
    目录一、什么是泛型二、语法三、示例1、简单示例2、返回最大值-支持各种数据类型3、泛型类4、类型通配符总结一、什么是泛型 Java 泛型(generics)是 JDK 5 中引入的一...
    99+
    2024-04-02
  • 一篇文章带你入门java集合
    目录一、简介1、java集合框架图2、集合框架体系3、Set和List的区别二、ArrayList1、定义2、用实例了解ArrayList三、LinkedList1、语法2、示例四、...
    99+
    2024-04-02
  • 一篇文章带你入门java注解
    目录注解什么是注解内置注解元注解自定义注解实例总结注解 什么是注解 Annotation是从JDK5.0开始引入的新技术 Annotation的作用: ...
    99+
    2024-04-02
  • 一篇文章带你入门Java接口
    目录什么是接口:关键字:创建接口代码展示:如何实现接口呢:实现接口代码展示:具体代码实现:接口继承和类继承的区别:总结什么是接口: 接口是一系列方法的声明,是一些方法特征的集合 注...
    99+
    2024-04-02
  • 一篇文章带你入门Java封装
    目录什么是封装如何实现封装代码展示构造方法注意点:代码展示总结封装的优点什么是封装 Java中的封装是将数据(变量)和作用于数据(方法)的代码作为一个单元包装在一起的机制。 在封装中...
    99+
    2024-04-02
  • 一篇文章带你入门java方法
    目录方法的使用什么是方法方法的语法基本语法代码示例注意事项方法的调用调用规则代码示例方法的重载引例使用重载重载规则方法递归递归定义代码示例递归执行过程分析总结方法的使用 什么是方法 ...
    99+
    2024-04-02
  • 一篇文章带你入门SQL编程
    目录1.学习sql之前回忆一下,什么是变量?2.变量分为局部变量和全局变量1:局部变量:2:全局变量3.select语句和set语句区别4.数据类型转换5.逻辑控制语句1:...
    99+
    2024-04-02
  • 一篇文章带你入门C语言:操作符
    目录操作符分类算术操作符移位操作符整数存储规则左右移位规则赋值操作符单目操作符取地址操作符& 解引用操作符*类型长度操作符sizeof按位取反操作符~++ -- 操作符强制类...
    99+
    2024-04-02
  • 一篇文章带你入门Java运算符
    目录算数运算符(Arithmetic operator)关系运算符(Relational operator)逻辑运算符(Logical operator)赋值运算符(Assignme...
    99+
    2024-04-02
  • 一篇文章带你入门Java修饰符
    目录定义分类访问控制修饰符非访问控制修饰符修饰符的使用说明修饰类修饰方法访问控制修饰符非访问控制修饰符修饰变量总结定义 Java修饰符:修饰符用来定义类、方法或者变量,通常放在语句的...
    99+
    2024-04-02
  • 一篇文章带你入门Java UML的类图
    目录一、什么是UML二、UML类图总结一、什么是UML 统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作