C++面向对象程序设计(第二版)-第九章 异常处理

合集下载

编程中数据类型的容错处理与异常处理

编程中数据类型的容错处理与异常处理

编程中数据类型的容错处理与异常处理在编程中,数据类型是非常重要的概念之一。

不同的数据类型具有不同的特点和用途,而正确处理数据类型的容错和异常情况是编程工程师必不可少的技能之一。

本文将探讨编程中数据类型的容错处理与异常处理的重要性以及一些常见的处理方法。

一、数据类型的容错处理数据类型的容错处理是指在程序运行过程中,对于不符合预期数据类型的值进行处理,以避免程序崩溃或产生错误结果。

容错处理的目的是保证程序的稳定性和可靠性。

1. 类型检查在编程中,可以使用类型检查来验证输入数据的类型是否符合预期。

例如,在接收用户输入时,可以使用条件语句或类型检查函数来判断输入数据的类型是否正确。

如果类型不匹配,可以给出相应的提示或重新要求用户输入。

2. 类型转换当数据类型不匹配时,可以使用类型转换来将数据转换为所需的类型。

例如,将字符串转换为整数或浮点数,或将整数转换为字符串。

在进行类型转换时,需要注意可能会引发的异常情况,如字符串无法转换为数字等。

3. 异常处理当数据类型错误无法通过类型检查或类型转换解决时,可以使用异常处理来处理异常情况。

异常处理是一种在程序中捕获并处理错误的机制。

通过使用异常处理,可以使程序在出现异常情况时进行适当的处理而不会崩溃。

二、异常处理异常处理是编程中非常重要的一部分,它可以帮助我们在程序出现错误或异常情况时进行处理,从而保证程序的正常运行。

1. 异常的分类异常可以分为两类:已检查异常和未检查异常。

已检查异常是指在编译时强制要求处理的异常,如文件读写错误、网络连接错误等。

未检查异常是指在运行时可能发生但不需要强制处理的异常,如空指针异常、数组越界异常等。

2. 异常处理的方法在编程中,可以使用try-catch语句块来捕获和处理异常。

try块中包含可能引发异常的代码,而catch块用于捕获并处理异常。

通过使用catch块,可以对不同类型的异常进行不同的处理,如输出错误信息、记录日志、重新尝试操作等。

2024年C++面向对象程序设计教案(含多款)

2024年C++面向对象程序设计教案(含多款)

C++面向对象程序设计教案(含多款)C++面向对象程序设计教案一、教学目标1.理解面向对象程序设计的基本概念,包括类、对象、继承、多态等。

2.掌握C++面向对象程序设计的基本语法和编程技巧。

3.能够运用面向对象的思想进行程序设计,解决实际问题。

二、教学内容1.面向对象程序设计的基本概念(1)类与对象类是对具有相同属性和行为的一组对象的抽象描述。

对象是类的实例,具有类定义的属性和行为。

(2)继承继承是面向对象程序设计的一个重要特性,用于表示类之间的层次关系。

子类可以继承父类的属性和行为,并在此基础上添加新的属性和行为。

(3)多态多态是指同一个操作作用于不同的对象时,可以有不同的解释和行为。

多态分为编译时多态和运行时多态。

2.C++面向对象程序设计的基本语法(1)类的定义与实现类定义包括类名、属性(成员变量)和方法(成员函数)。

类实现包括成员函数的定义。

(2)构造函数与析构函数构造函数用于创建对象时初始化成员变量,析构函数用于对象销毁时释放资源。

(3)继承与派生继承使用关键字class和public、protected、private访问限定符。

派生类可以添加新的成员变量和方法,也可以重写父类的方法。

(4)多态的实现多态可以通过虚函数、抽象类和接口实现。

虚函数使用关键字virtual声明,抽象类包含至少一个纯虚函数,接口是一种特殊的抽象类,只包含纯虚函数。

3.面向对象程序设计实例(1)设计一个简单的银行账户管理系统,包括账户类、储蓄账户类和信用卡账户类。

(2)设计一个图形类库,包括点、线、矩形和圆形等基本图形类。

三、教学方法1.讲授法:讲解面向对象程序设计的基本概念、语法和编程技巧。

2.案例分析法:通过分析实际案例,让学生理解面向对象程序设计的应用。

3.实践法:让学生动手编写代码,加深对面向对象程序设计的理解。

4.讨论法:组织学生讨论面向对象程序设计在实际项目中的应用。

四、教学评价1.课后作业:布置课后作业,检查学生对课堂知识的掌握程度。

详解C++异常处理(trycatchthrow)完全攻略

详解C++异常处理(trycatchthrow)完全攻略

详解C++异常处理(trycatchthrow)完全攻略程序运⾏时常会碰到⼀些异常情况,例如:做除法的时候除数为 0;⽤户输⼊年龄时输⼊了⼀个负数;⽤ new 运算符动态分配空间时,空间不够导致⽆法分配;访问数组元素时,下标越界;打开⽂件读取时,⽂件不存在。

这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃。

所谓“处理”,可以是给出错误提⽰信息,然后让程序沿⼀条不会出错的路径继续执⾏;也可能是不得不结束程序,但在结束前做⼀些必要的⼯作,如将内存中的数据写⼊⽂件、关闭打开的⽂件、释放动态分配的内存空间等。

⼀发现异常情况就⽴即处理未必妥当,因为在⼀个函数执⾏过程中发⽣的异常,在有的情况下由该函数的调⽤者决定如何处理更加合适。

尤其像库函数这类提供给程序员调⽤,⽤以完成与具体应⽤⽆关的通⽤功能的函数,执⾏过程中贸然对异常进⾏处理,未必符合调⽤它的程序的需要。

此外,将异常分散在各处进⾏处理不利于代码的维护,尤其是对于在不同地⽅发⽣的同⼀种异常,都要编写相同的处理代码也是⼀种不必要的重复和冗余。

如果能在发⽣各种异常时让程序都执⾏到同⼀个地⽅,这个地⽅能够对异常进⾏集中处理,则程序就会更容易编写、维护。

鉴于上述原因,C++ 引⼊了异常处理机制。

其基本思想是:函数 A 在执⾏过程中发现异常时可以不加处理,⽽只是“拋出⼀个异常”给 A 的调⽤者,假定为函数 B。

拋出异常⽽不加处理会导致函数 A ⽴即中⽌,在这种情况下,函数 B 可以选择捕获 A 拋出的异常进⾏处理,也可以选择置之不理。

如果置之不理,这个异常就会被拋给 B 的调⽤者,以此类推。

如果⼀层层的函数都不处理异常,异常最终会被拋给最外层的 main 函数。

main 函数应该处理异常。

如果main函数也不处理异常,那么程序就会⽴即异常地中⽌。

C++异常处理基本语法C++ 通过 throw 语句和 try...catch 语句实现对异常的处理。

throw 语句的语法如下:throw 表达式;该语句拋出⼀个异常。

代码中如何进行异常处理

代码中如何进行异常处理

代码中如何进行异常处理异常处理是一种预防程序崩溃的重要技术。

在编写程序时,可能会遇到各种状况,比如程序遇到无法处理的数据、无法打开文件、网络连接失败等等问题。

这些状况都可以被称为异常。

当程序在运行过程中遇到异常时,如果没有进行有效的处理,程序就可能会崩溃或表现出不可预料的行为。

而如果程序能够针对异常进行有效的处理,就可以保证程序的稳定性和可靠性。

本文将讨论代码中如何进行异常处理,以及异常处理的最佳实践。

一、异常的分类在开始讨论异常处理之前,需要了解异常的分类。

根据其来源以及对程序的影响,异常可以分为两种类型:一种是受检异常(Checked Exception),另一种是非受检异常(Unchecked Exception)。

1.受检异常受检异常通常是由外部因素引起的问题,如网络连接错误、IO操作错误等。

这些异常是在编译期间就已经被发现的,编译器要求开发人员必须要明确地捕获这些异常并进行处理。

否则编译器就会报错,强制要求开发人员对异常进行处理。

在Java中,受检异常都要继承自Exception类或者其子类。

比如IOException、SQLException等,这些都是受检异常的典型代表。

在使用受检异常时,开发人员必须要用try-catch语句块来捕获这些异常,并对它们进行处理。

因为受检异常已经在编译期就被确定了,所以Java编译器要求开发人员必须要进行异常处理,否则就会编译错误。

2.非受检异常非受检异常也称程序异常(Program Exception),通常是由代码中的错误导致的问题。

比如数组下标越界、类型转换错误等。

这些异常都是在运行期间才会发现的,而且程序在遇到这些异常时通常都会崩溃。

与受检异常不同的是,非受检异常不会被Java编译器要求进行处理。

开发人员可以选择捕获这些异常,也可以选择不处理。

Java中非受检异常通常要继承自RuntimeException类或其子类。

比如NullPointerException、IndexOutOfBoundsException等,这些都是非受检异常的典型代表。

C++面向对象程序设计(完整课件)

C++面向对象程序设计(完整课件)
参数。
函数参数传递方式
包括值传递、引用传递 和指针传递三种方式。
函数返回值
函数可以返回一个值, 返回类型应与函数定义 时的返回类型一致。
03
面向对象程序设计基础
类与对象概念引入
类(Class)定义
类是创建对象的模板,它定义了对象的属性和方法。
对象(Object)概念
对象是类的实例,具有类定义的属性和行为。
安装Qt
介绍在不同操作系统下如何安装Qt,包括Windows、 Linux和macOS等。
配置Qt开发环境
详细讲解如何配置Qt开发环境,包括设置环境变量、安装 Qt Creator等。
Qt基本控件使用教程
Qt控件概述
01
简要介绍Qt中常用的控件,如按钮、标签、文本框等

使用Qt Designer设计界面
C++面向对象程序设计(完整课件)
$number {01} 汇报人:XX
2024-01-18
目录
• 课程介绍与目标 • C基础语法回顾 • 面向对象程序设计基础 • C高级特性剖析 • 实战项目:基于C的图形界面开
发 • 课程总结与展望
01
课程介绍与目标
课程背景与意义
1 2
3
面向对象程序设计概述
类与对象关系
类是对象的抽象描述,而对象是类的具体实现。
封装性原理及实践
封装(Encapsulation)定义
将数据和操作数据的函数捆绑在一起,形成“对象”。
封装优点
提高代码重用性、安全性和可维护性。
封装实践
使用访问修饰符(public、private、protected)来控制成员变量和成员函数的可见性。

C++异常处理:try,catch,throw,finally的用法

C++异常处理:try,catch,throw,finally的用法

C++异常处理:try,catch,throw,finally的⽤法写在前⾯所谓异常处理,即让⼀个程序运⾏时遇到⾃⼰⽆法处理的错误时抛出⼀个异常,希望调⽤者可以发现处理问题.异常处理的基本思想是简化程序的错误代码,为程序键壮性提供⼀个标准检测机制.也许我们已经使⽤过异常,但是你习惯使⽤异常了吗?现在很多软件都是n36524⼩时运⾏,软件的健壮性⾄关重要.内容导读本⽂包括2个⼤的异常实现概念:C++的标准异常和SEH异常.C++标准异常:也许你很⾼兴看到错误之后的Heap/Stack中对象被释放,可是如果没有呢?⼜或者试想⼀下⼀个能解决的错误,需要我们把整个程序Kill掉吗?在《C++标准异常》中我向你推荐这⼏章:<使⽤异常规格编程> <构造和析构中的异常抛出> <使⽤析构函数防⽌资源泄漏>,以及深⼊⼀点的<抛出⼀个异常的⾏为>.SEH异常:我要问你你是⼀个WIN32程序员吗?如果不是,那么也许你真的不需要看.SEH是Windows的结构化异常,每⼀个WIN32程序员都应该要掌握它.SEH功能强⼤,包括Termination handling和Exception handling两⼤部分.强有⼒的维护了代码的健壮,虽然要以部分系统性能做牺牲(其实可以避免).在SEH中有⼤量的代码,已经在Win平台上测试过了.这⾥要提⼀下:在__finally处理中编译器参与了绝⼤多数的⼯作,⽽Exception则是OS接管了⼏乎所有的⼯作,也许我没有提到的是:对__finally来说当遇到ExitThread/ExitProcess/abort等函数时,finally块不会被执⾏.另:<使⽤析构函数防⽌资源泄漏>这个节点引⽤了More effective C++的条款9.⽤2个列⼦,讲述了我们⼀般都会犯下的错误,往往这种错误是我们没有意识到的但确实是会给我们的软件带来致命的Leak/Crash,但这是有解决的⽅法的,那就是使⽤“灵巧指针”.如果对照<More effective C++>的37条条款,关于异常的⾼级使⽤,有以下内容是没有完成的:使⽤构造函数防⽌资源Leak(More effective C++ #10)禁⽌异常信息传递到析构Function外 (More effective C++ #11)通过引⽤捕获异常(More effective C++ #13)谨慎使⽤异常规格(More effective C++ #14)了解异常处理造成的系统开销(More effective C++ #15)限制对象数量(More effective C++ #26)灵巧指针(More effective C++ #28)C++异常C++引⼊异常的原因:例如使⽤未经处理的pointer变的很危险,Memory/Resource Leak变的更有可能了.写出⼀个具有你希望的⾏为的构造函数和析构函数也变的困难(不可预测),当然最危险的也许是我们写出的东东狗屁了,或者是速度变慢了.⼤多数的程序员知道Howto use exception 来处理我们的代码,可是很多⼈并不是很重视异常的处理(国外的很多Code倒是处理的很好,Java的Exception机制很不错).异常处理机制是解决某些问题的上佳办法,但同时它也引⼊了许多隐藏的控制流程;有时候,要正确⽆误的使⽤它并不容易.在异常被throw后,没有⼀个⽅法能够做到使软件的⾏为具有可预测性和可靠性对C程序来说,使⽤Error Code就可以了,为什么还要引⼊异常?因为异常不能被忽略.如果⼀个函数通过设置⼀个状态变量或返回错误代码来表⽰⼀个异常状态,没有办法保证函数调⽤者将⼀定检测变量或测试错误代码.结果程序会从它遇到的异常状态继续运⾏,异常没有被捕获,程序⽴即会终⽌执⾏.在C程序中,我们可以⽤int setjmp( jmp_buf env );和 void longjmp( jmp_buf env, int value );这2个函数来完成和异常处理相识的功能,但是MSDN中介绍了在C++中使⽤longjmp来调整stack时不能够对局部的对象调⽤析构函数,但是对C++程序来说,析构函数是重要的(我就⼀般都把对象的Delete放在析构函数中).所以我们需要⼀个⽅法: 能够通知异常状态,⼜不能忽略这个通知. 并且Searching the stack以便找到异常代码时. 还要确保局部对象的析构函数被Call.⽽C++的异常处理刚好就是来解决这些问题的.有的地⽅只有⽤异常才能解决问题,⽐如说,在当前上下⽂环境中,⽆法捕捉或确定的错误类型,我们就得⽤⼀个异常抛出到更⼤的上下⽂环境当中去.还有,异常处理的使⽤呢,可以使出错处理程序与“通常”代码分离开来,使代码更简洁更灵活.另外就是程序必不可少的健壮性了,异常处理往往在其中扮演着重要的⾓⾊.C++使⽤throw关键字来产⽣异常,try关键字⽤来检测的程序块,catch关键字⽤来填写异常处理的代码.异常可以由⼀个确定类或派⽣类的对象产⽣。

C#中异步编程异常的处理方式

C#中异步编程异常的处理方式

C#中异步编程异常的处理⽅式异步编程异常处理在同步编程中,⼀旦出现错误就会抛出异常,我们可以使⽤try…catch来捕捉异常,未被捕获的异常则会不断向上传递,形成⼀个简单⽽统⼀的错误处理机制。

但是对于异步编程来说,异常处理⼀直是件⿇烦的事情,所以接下来给⼤家介绍⼀下异步单个异常的捕获public static async Task ThrowExcrptionAsync(int ms, string message){await Task.Delay(ms);throw new Exception(message);}public static async Task Main(string[] args){try{ThrowExcrptionAsync(2000, "first");}catch (Exception e){Console.WriteLine(e.Message);}Console.ReadKey();}如果调⽤以上的⽅法,并且没有等待,可以将异步⽅法放在try/catch中就可以捕获到异常,⽐如像上⾯⼀样调⽤ThrowExcrptionAsync⽅法,⽅法已经执⾏完毕,⽽throw newException(message)这句话还没执⾏,所以上⾯这段代码并不会捕获到异常注意:返回void的异步⽅法不会等待,这是因为从async void⽅法抛出的异常⽆法捕获,因此,异步⽅法最好返回⼀个Task类型。

处理程序⽅法或重写的基类⽅法不受此规则限制异步⽅法异常的⼀个⽐较好的处理⽅式是使⽤await关键字,将其放在try/catch语句中,如以下代码琐事。

异步调⽤ThrowExcrptionAsync⽅法后,主线程就会释放线程,但塔会在任务完成时保持任务的引⽤,此时(2s之后)会调⽤匹配的catch块内的代码public static async Task Main(string[] args){try{await ThrowExcrptionAsync(2000, "first");}catch (Exception e){Console.WriteLine(e.Message);}Console.ReadKey();}多个异常的捕获此时如果调⽤两个异步⽅法,每个⽅法都会抛出异常,我们该如何处理呢?如以下代码public static async Task Main(string[] args){try{await ThrowExcrptionAsync(2000, "first");await ThrowExcrptionAsync(1000, "second");}catch (Exception e){Console.WriteLine(e.Message);}Console.ReadKey();}第⼀个ThrowExcrptionAsync被调⽤,2s抛出异常信息(包含信息first),该⽅法结束后,另⼀个ThrowExcrptionAsync⽅法也被调⽤,1s之后抛出异常,事实并⾮如此,因为第⼀个ThrowExcrptionAsync已经抛出了异常,try块内的代码块并没有继续调⽤第⼆个ThrowExcrptionAsync⽅法。

C语言的异常处理与错误处理

C语言的异常处理与错误处理

C语言是一种强大而灵活的编程语言,具有广泛的应用领域。

然而,像其他编程语言一样,C语言也会遇到错误和异常情况。

在C语言中,异常处理和错误处理非常重要,它们可以帮助我们更好地理解和解决程序中可能出现的问题。

在本文中,我们将深入探讨C语言中的异常处理和错误处理,并介绍一些常用的技术和最佳实践。

1. 异常和错误的区别异常和错误在某种程度上是相似的,它们都表示程序中的问题。

但是在C语言中,异常和错误有一些细微的区别。

异常通常是由于程序逻辑错误或意外情况引起的。

例如,当我们尝试除以零或访问不存在的数组元素时,会引发异常。

异常是由于程序的错误或意外情况而导致程序无法继续执行的情况。

错误通常是由于外部因素引起的,例如无法打开文件或网络连接失败。

错误通常是由于程序以外的原因导致的,而不是由于程序本身的错误。

无论是异常还是错误,我们都需要在程序中进行处理,以便优雅地处理和恢复程序的执行。

2. 异常处理技术在C语言中,有几种常用的异常处理技术。

让我们逐一介绍它们。

错误码处理是一种简单而常见的异常处理技术。

它基于一个简单的原则:当函数执行失败时,它会返回一个特殊的错误码,我们可以根据错误码来判断函数是否执行成功,并采取相应的措施。

例如,当使用C语言内置的文件操作函数时,如果打开文件失败,函数将返回一个特殊的错误码,我们可以使用该错误码来判断文件是否成功打开,并采取适当的措施。

错误码处理的一个优点是简单易懂,但它也有一定的局限性。

在处理错误码时,我们需要编写大量的条件语句来判断错误码,并采取相应的措施。

这可能会导致代码冗长和混乱。

2.2. 异常处理语句异常处理语句是一种更高级的异常处理技术。

它基于异常处理机制,允许我们在程序中显式地引发和捕获异常。

C语言没有像其他编程语言那样内置异常处理语句,但我们可以使用一些库来实现类似的功能。

例如,通过使用C标准库中的setjmp和longjmp函数,我们可以实现异常处理语句。

异常处理语句的优点是可以在程序中灵活地处理异常,而不需要大量的条件语句。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
打开Project Settings对话框。 选择C / C++选项卡。 在Category栏中选择C++ language。 选择Enable Exception Handling 。

C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构

C++异常处理的功能较为完善,它不仅 能够处理各种不同类型的异常,而且具 有为异常抛掷前构造的所有局部对象自 动调用析构函数的能力。
C++面向对象程序设计
2015年2月5日星期四
9.2.2 异常处理的规则

程序运行结果为:
Modulus(5,2) is 1 exception of dividing zero! end of the program
C++面向对象程序设计
2015年2月5日星期四
9.2.2 异常处理的规则

在VC++6.0环境中,为了使用异常处理 机制,需要进行以下设置:
中国水利水电出版社
C++面向对象程序设计(第二版)
主编 曹静
C++面向对象程序设计(第二版)
第九章 异常处理
第九章 异常处理
9.1 异常处理的基本思想 9.2 C++异常处理的实现 9.3 异常处理中的构造与析构

C++面向对象程序设计
2015年2月5日星期四
9.1 异常处理的基本思想

C++面向对象程序设计 2015年2月5日星期四
9.1 异常处理的基本思想

C++的异常处理机制使得异常的引发和 处理不需要在同一函数内完成,它可以 将异常向上传播,这样底层的函数可以 专门用以解决具体问题,而上层的调用 者就可以在适当的位置针对不同类型的 异常设计处理。
C++面向对象程序设计
2015年2月5日星期四
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构

程序运行结果Demo。 在MyFunc ( ) 中抛掷Expt类异常。 析构Demo。 在catch异常处理程序中。 捕获到Expt类型异常:Expt 类异常。 程序运行回到main函数。从这里恢复执行。
const char *ShowReason() const { return "Expt类异常。"; } };
C++面向对象程序设计 2015年2月5日星期四
9.3 异常处理中的构造与析构
class Demo { public: Demo(); ~Demo(); }; Demo::Demo() { cout << "构造 Demo." << endl; } Demo::~Demo() { cout << "析构 Demo." << endl; }
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构

当catch子句的异常类型声明参数被初 始化,栈的展开过程便开始了。这包括 将从对应的try块开始到异常被抛掷处 之间构造且尚未析构的所有自动对象进 行析构。析构的顺序与构造的顺序相反 。程序会从最后的一个catch处理之后 开始恢复执行。
C++面向对象程序设计
2015年2月5日星期四
9.2.2 异常处理的规则

编写异常处理程序的规则是:
如果预料某段程序代码(或对某个函数的 调用)有可能发生异常,就将它放在try 子句之后。 如果某段程序中出现了自己不能处理的异 常,就可以使用throw语句来抛掷出这个 异常,将它抛掷给调用者。
计算机程序在机器上运行时会产生错误 ,这些错误对于编程人员可以预料到但 却无法避免。 在一个小型程序中,一旦程序运行时发 生了异常,一般是将程序立即中断运行 ,从而无条件释放所有资源。而在一个 较为复杂的软件中,函数与函数之间存 在着各自明确的功能和相互间复杂的调 用关系,发现错误的函数又并不具备处 理错误的能力。
C++面向对象程序设计
2015年2月5日星期四
C++面向对象程序设计 2015年2月5日星期四
9.2.1 异常处理的机制


try子句后的复合语句是代码的保护段。 catch子句后的复合语句是用来处理异常的程 序,处理由throw表达式抛掷的异常。 当错误侦测区块里的程序执行发生错误时, 将会利用throw语句将异常类型抛出错误侦测 区块,在对比catch语句中的异常类型后,寻 找出并执行处理该异常类型的程序区块。当 该区块执行完毕后,将继续执行catch语句后 的程序。
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构

在一个程序中,找到一个匹配的catch 异常处理后,如果catch子句的异常类 型声明是一个值参数,那么在初始化时 是赋值被抛掷的异常对象。如果catch 子句的异常类型声明是一个引用,那么 在初始化时是使该引用指向异常对象。
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构
void MyFunc() { Demo D; cout<< "在MyFunc()中抛掷Expt类异常。" << endl; throw Expt(); } int main() { cout << "在main函数中。" << endl; try { cout << "在try块中,调用MyFunc()。" << endl; MyFunc(); }

C++面向对象程序设计
2015年2月5日星期四
9.2.2 异常处理的规则
catch子句后的复合语句用来处理由throw 表达式抛掷的异常。 当异常被抛掷以后,catch子句便依次被 检查,若某个catch子句的异常类型声明 与被抛掷的异常类型一致,则执行该段异 常处理程序。

C++面向对象程序设计
2015年2月5日星期四
9.2.2 异常处理的规则

例:处理除零异常
#include <iostream> using namespace std; int try_modulus(int,int); void main() { try //代码保护段 { cout<<"Modulus(5,2) is "<<try_modulus(5,2)<<endl; cout<<"Modulus(3,0) is "<<try_modulus(3,0)<<endl; cout<<"Modulus(8,5) is "<<try_modulus(8,5)<<endl; } catch(char *s) //处理异常 { cerr<<s; } cout<<"end of the program.\n"; } int try_modulus(int x,int y) { if(y==0) //检查被除数是否为零,是则抛出异常 throw("exception of dividing zero!\n"); return x%y; }
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构

例:使用带析构语义的类的C++异常处理
#include <iostream> using namespace std; void MyFunc(void); class Expt { public: Expt(){}; ~Expt(){};
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构
catch( Expt E ) { cout << "在catch异常处理程序中。" << endl; cout << "捕获到Expt类型异常:"; cout << E.ShowReason() << endl; } catch( char *str ) { cout << "捕获到其它的异常:" << str << endl; } cout << "回到main函数。从这里恢复执行。" << endl; return 0; }

C++面向对象程序设计
2015年2月5日星期四
9.2.1 异常处理的机制



如果在保护段执行期间或在保护段调用的任 何函数中有异常被抛掷,则从通过throw操作 数创建的对象中创建一个异常对象。 如果匹配的处理器未找到,则运行函数 terminate将被自动调用,而函数terminate 的默认功能是调用abort终止程序。 如果找到了一个匹配的catch处理程序,且它 通过值进行捕获,则其行参通过拷贝异常对 象进行初始化。
C++面向对象程序设计
2015年2月5日星期四
9.2.1 异常处理的机制

异常处理的执行过程分成以下几个步 骤:
相关文档
最新文档