C++ 异常对象

1.catch子句参数为对象

先看一段代码:

#include <iostream>
#include <exception>
using namespace std;
class MyException :public exception{
public:
	MyException(){
		cout<<"MyException()"<<endl;
	}
	~MyException(){
		cout<<"~MyException()"<<endl;
	}
	MyException(const MyException& rhs){
		cout<<"MyException(const MyException& rhs)"<<endl;
	}
	void what(){
		cout<<"MyException what()"<<endl;
	}
};

class DerivedException:public MyException{
public:
	DerivedException(){
		cout<<"DerivedException()"<<endl;
	}
	~DerivedException(){
		cout<<"~DerivedException()"<<endl;
	}
	//派生类如果不显示调用基类的拷贝构造函数,则会隐式得调用基类的默认构造函数
	DerivedException(const DerivedException& rhs):MyException(rhs){
		cout<<"DerivedException(const DerivedException& rhs)"<<endl;
	}
	void what(){
		cout<<"DerivedException what()"<<endl;
	}
};

void ExceptionTest(){
	try{
		throw DerivedException();//这不是一个局部对象,并不会随着ExceptionTest()的退栈而销毁
	}catch(MyException ex){
		ex.what();
		throw; //重新抛出的是原来的异常对象;没有更改过的。
	}
}

int main(){
	try{
		ExceptionTest();
	}catch(DerivedException ex){
		ex.what();
	}
	return 0;
}

程序运行结果:

2.当catch子句为引用参数

代码如下:

#include <iostream>
#include <exception>
using namespace std;
class MyException :public exception{
public:
	MyException(){
		cout<<"MyException()"<<endl;
	}
	~MyException(){
		cout<<"~MyException()"<<endl;
	}
	MyException(const MyException& rhs){
		cout<<"MyException(const MyException& rhs)"<<endl;
	}
	void what(){
		cout<<"MyException what()"<<endl;
	}
};

class DerivedException:public MyException{
public:
	DerivedException(){
		cout<<"DerivedException()"<<endl;
	}
	~DerivedException(){
		cout<<"~DerivedException()"<<endl;
	}
	//派生类如果不显示调用基类的拷贝构造函数,则会隐式得调用基类的默认构造函数
	DerivedException(const DerivedException& rhs):MyException(rhs){
		cout<<"DerivedException(const DerivedException& rhs)"<<endl;
	}
	void what(){
		cout<<"DerivedException what()"<<endl;
	}
};

void ExceptionTest(){
	try{
		throw DerivedException();//这不是一个局部对象,并不会随着ExceptionTest()的退栈而销毁
	}catch(MyException &ex){
		ex.what();
		throw; //如果对ex做出改变,则改变会被繁殖到下一个catch子句中
	}
}

int main(){
	try{
		ExceptionTest();
	}catch(DerivedException &ex){
		ex.what();
	}
	return 0;
}

程序运行结果如下:

时间: 2024-10-11 03:00:28

C++ 异常对象的相关文章

[python] 之 异常对象

一.异常对象 类异常支持异常的层次结构:超类变成分类名称,而子类变成这个分类中特定种类的异常.except字句列出一个通用的异常超类,就可捕捉整个分类中的各种异常:任何特定的子类都可匹配. 1 class General(Exception):pass 2 class Specific1(General):pass 3 class Specific2(General):pass 4 5 def raise0(): 6 x=General() 7 raise x 8 9 def raise1():

正确使用Exception异常对象

一.异常的构成 new Exception() 创建异常对象 throw 抛出异常对象(主要性能损耗位置) try{}catch{} 捕捉异常对象 C#里面异常对象分为两个子类ApplicationException.SystemException,前者主要是提供给应用程序自定义的异常类,后者是提供给系统定义的异常类 二.如何使用异常 异常的正常逻辑是:由底层抛出,由高层处理 1.底层方法或者提供给其他人使用方法内的一些参数过滤或其它异常应该向上抛出 如(借鉴现成代码懒得写了): public

异常对象

内置异常和用户定义的异常,均可以用类或实例来表示,建议用类及实例来定义并捕获异常 一.类异常的优点: 二.类异常的例子: 1. 继承了(超类)Excption 2. 定义的except General匹配规则,可以捕获(分类)General及其所有的子类 3. 异常处理器:sys.exc_info()的调用 三.为什么要使用类异常:灵活的扩展性 except的匹配表达式里,通过类树的匹配,能捕获所有的分类及子类, 未来程序对子类新增,修改,删除等,通过类树或分类的匹配,不需要修改任何关联程序的代

《python学习手册》第34章 异常对象

基于字符串的异常 python在2.6之前可以使用字符串来定义异常,并且是通过对象标识符来匹配的(即通过is 而不是==) myexc = "My excetion string" try: raise myexc except myexc: print('caught') 基于类的异常 字符串定义的异常非常简单,但是并不容易维护.使用类定义的异常通过超类关系进行匹配,只要except列举出来的异常的类或者任何超类名,引发的异常都会匹配到.此外,类的异常还支持异常状态信息,可以让异常参

Java内存区域与内存溢出异常---对象的创建

对象的创建 ??在语言层面,创建一个对象通常仅仅是一个new关键字而已.在虚拟机层面,虚拟机遇到一个new指令时,首先回去检查这个指令的参数是能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载,解析和初始化过.如果没有那么必须先执行类加载操作. ??在类加载检查通过后,虚拟机将为对象从Java堆上划分出一块内存空间.有两种分配方式: (1)指针碰撞 ??假设Java堆中的内存时规整的,所有用过的内存放在一边,没有用过的内存放在一边,中间放着一个指针作为分界的指示器,那么分

Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换

{ "@type":"java.lang.RuntimeException", "cause":{ "@type":"com.attilax.sql.EmptyRzt", "localizedMessage":"mmmm1", "message":"mmmm1", "stackTrace":[{ "

面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】

  本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ 本文版权归作者和博客园共有,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接 ,否则保留追究法律责任的权利. 面向对象概念 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 •强调的是功能行为 面向对象 •将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向过程   在一个结构体中定义窗口的大小

异常笔记--java编程思想

开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止                                          3. 当前环境抛出异常对象的引用.                                         4. 异常处理机制接

Java必知必会:异常机制详解

一.Java异常概述 在Java中,所有的事件都能由类描述,Java中的异常就是由java.lang包下的异常类描述的. 1.Throwable(可抛出):异常类的最终父类,它有两个子类,Error与Exception. Throwable中常用方法有: getCause():返回抛出异常的原因.如果 cause 不存在或未知,则返回 null. getMeage():返回异常的消息信息. printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值.