c++中的异常 exception

变成入门的时候可能经常遇到的错误:

this application has requested the runtime to terminate it in an unusual way. Please contact the application's support team for more information

这是由于程序在运行时发生了未知的错误,例如:打开不存在的文件,爆栈,除数为0等错误,程序直接调用abort()函数直接终止程序的运行;当然,显示的信息不一定就是上面这一条

上面这个情况是程序自己解决异常的问题,这种方式实际上是非常粗暴的,直接终止了程序运行,而且你还不知道程序错在哪个位置,是因为什么错(当然,用万能的cout强行追踪也是阔以滴,哈哈)

所幸,c++引入了比较优雅的try... catch....异常机制来让程序猿自己处理可能出现的异常,这种机制实际上是避免了程序直接调用abort()函数,使程序看起来更优雅一点,具体结构如下:

try{
// 可能会引发异常的代码块
}catch(exception argument){
//处理捕捉到的异常
}

try...catch...机制实际上主要是以下几个部分:

1.将可能引发异常的代码(如:文件读取等)放入try块中

2.判断在什么时候抛出异常,也就是可能引发异常的代码块中需要添加异常抛出的语句,抛出异常通常使用 throw关键字

3.catch首先通过异常参数列表匹配产生的异常,如果匹配成功,那么执行catch块的代码

先写一个简单的例子

首先是没有异常处理的

#include <iostream>
using namespace std;

int division(int a, int b){
	return a / b;
}

int main(){
	int a, b;
	while(1){
		cout << "Please input a and b: ";
		cin >> a >> b;
		cout << "a / b = " << division(a, b) << endl;
	}
	return 0;
}

随便测试了一下,结果如下:

可以看到程序是直接结束了,并没有理会那个while(1)

那我们现在来加一下异常

#include <iostream>
using namespace std;

int division(int a, int b){
<span style="white-space:pre">	</span>if(b == 0)
<span style="white-space:pre">		</span>throw "Divisor is not allowed to be 0";
<span style="white-space:pre">	</span>return a / b;
}

int main(){
<span style="white-space:pre">	</span>int a, b;
<span style="white-space:pre">	</span>while(1){
<span style="white-space:pre">		</span>cout << "Please input a and b: ";
<span style="white-space:pre">		</span>cin >> a >> b;
<span style="white-space:pre">		</span>try{
<span style="white-space:pre">			</span>cout << "a / b = " << division(a, b) << endl;
<span style="white-space:pre">			</span>cout << "successful division" << endl;
<span style="white-space:pre">		</span>}catch(const char* msg){
<span style="white-space:pre">			</span>cout << "Error message is: " << msg << endl; 
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>return 0;
}

运行结果:

可以看到现在我们可以知道是哪个地方除了问题,并且可以print出异常信息,更重要的是,程序依然可以继续往下执行

可以看到,在产生异常之后,程序马上跳转到匹配的catch块执行,而终止try块中代码的执行

当然,如果没有匹配上产生的异常(上面这个例子只是简单的匹配字符串,实际上更常用的是异常对象匹配),那么程序同样会调用abort()函数,然后编译器给你提示一堆错误的信息时候,你的程序就挂掉了

看了上面这个例子,是不是感觉try和catch有一点实参和型参的感觉

那下面我们来看一个例子

我们现在吧异常当作一个MyException的对象来处理:

#include <iostream>
using namespace std;

class MyException{
public:
	MyException(){
		msg = "";
		cout << "in the default constructor" << endl;
	}
	MyException(MyException &aa){
		msg = aa.msg;
		cout << "in the copy constructor" << endl;
	}
	MyException(string msg_){
		msg = msg_;
		cout << "in the string constructor" << endl;
	}
	string what(){
		return msg;
	}
	string msg;
};

int division(int a, int b){
	if(b == 0){
		MyException me("Divisor is not allowed to be 0");
		throw me;
	}

	return a / b;
}

int main(){
	int a, b;
	while(1){
		cout << "Please input a and b: ";
		cin >> a >> b;
		try{
			cout << "a / b = " << division(a, b) << endl;
			cout << "successful division" << endl;
		}catch(MyException &ME){
			cout << "Error message is: " << ME.what() << endl;
		}

	}
	return 0;
}

运行结果如下:

这里大家可能会疑惑,因为在正常的函数参数传递中,我们传递引用就是为了避免重复地构造对象,但是在try...catch...中就不一样了,throw在抛出异常的时候,无论catch是接受引用传递还是接受值传递,编译器都会在throw异常时新建一个临时对象,所以才会有上面结果中显示的两次构造MyException对象,而catch中的引用不过是指向这个临时对象而不是原本的那个MyException对象,一搬都是吧抛出异常跟新建异常对象合并在一起,这样更简洁,所以上面抛出异常可以写成

throw MyException("Divisor is not allowed to be 0");

本来还想说一下exception和他的一些派生类的,不过好像网上挺多这些东西的,也没什么可讲的,就收工了吧

大家有兴趣可以到这里去了解一下c++自带的标准异常类,都是一些形式性的东西,不难滴~~

时间: 2024-11-07 03:14:14

c++中的异常 exception的相关文章

JS中的异常exception

js提供了一套异常处理机制.异常是干扰程序的正常流程的不寻常事故,当发生这样的事故时,你的程序应该抛出一个异常 try_it() { try { console.log(add("1",2)) }catch(e){ console.log(e.name + ':' + e.message) } }, add(a,b) { if(typeof a != "number" || typeof b != "number"){ throw{ name:'

Python中获取异常(Exception)信息

异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序结构.如下所示 try: ... except Exception as e: ... 1.str(e) 返回字符串类型,只给出异常信息,不包括异常信息的类型,如1/0的异常信息 'integer division or modulo by zero' 2.repr(e) 给出较全的异常信息,包括异

Struts2 框架中怎么处理异常Exception

Struts2中异常的处理 在开发Java web应用程序时,由于程序的开发不太完善,导致用户在使用过程中会出现程崩溃的情况,结果就是在浏览器上看见一大堆怎么都看不懂的东西.对于一些商业级的应用可能损失上千万.Struts2 框架异常处理机制对于这种情况提供了有效的支持. 一般情况下,开发中往往希望是这样的:当用户请求发生了异常时,就会转入指定的错误视图资源,不同的异常转入不同的指定的视图资源,用户的体验度就提高了.处理方式有: 1. 在Action中使用try catch解决,但是这中解决方法

编写高质量代码改善C#程序的157个建议——建议68:从System.Exception或其他常见的基本异常中派生异常

建议68:从System.Exception或其他常见的基本异常中派生异常 微软建议:从System.Exception或其他常见基本异常之一派生异常.在Visual Studio中输入Exception,然后按快捷键Tab,VS会自动创建一个自定义异常类: [Serializable] public class MyException : Exception { // // For guidelines regarding the creation of new exception types

Python中获取异常(try Exception)信息

异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置. 这里获取异常(Exception)信息采用try...except...程序结构.如下所示: try: ... except Exception, e: ...经典例子: import traceback print '########################################################' print "1/0 Exception Info" print '---

Laravel 5.4 中的异常处理器和HTTP异常处理实例教程

错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便直观的知道程序在哪里出了问题并予以解决,而在线上环境我们不希望将程序错误或异常显示在浏览器中(出于安全考虑),这个时候我们仍然要捕获异常,只不过不是显示到浏览器中,而是记录到日志中,方便日后排查问题. 百牛信息技术bainiu.ltd整理发布于博客园 Laravel当然支持PHP原生的错误和异常处理,但是在此基础上进行了一些封装处理,从而更方便在不同开发环境切换以及对错误和异常的处理.

异常--Exception

异常(Exception) -->java是采用面向对象的方式来处理异常的.处理过程: --抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE. --捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常.JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止. -->NullPointerException : 当程序访问一个空对象的成员变量或方法,访问一个空数组的成员时发生.处理方法: T

C++、Java、JavaScript中的异常处理(Exception)

编程思想之异常处理 什么叫异常处理? 什么叫异常(Exception)?顾名思义就是非正常的情况,出现了不希望出现的意外,异常处理就是遇到这种意外时准备的对策和解决方案.比如您开着一辆劳斯莱斯在公路上行走,突然前面出现一个小孩,幸好您眼疾手快紧急刹车,而避免了一场交通事故.在这个例子中突然出现的小孩就是异常,紧急刹车就是异常处理(面对这种突发情况采取的解决方案). 程序来源于现实,是现实的抽象和模拟,也会有异常,因此异常的处理就显示的极为重要.试想如果您的手机的某个应用使用两下就崩溃了,或都出现

Java中的异常和处理详解

原文出处:代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函数返回值作为执行状态?. Java提供了更加优秀的解决办法:异常处理机制. 异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰. Java中的异常可以是函数中的语句执行时引发的,也可以是程序员通过throw 语句手