版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+C+计算机语言教学课件计算机语言教学课件lect11_exception_handlinlect11_exception_handling gObjectives In this chapter, you will learn: what exceptions are and when to use them using try, catch and throw to detect, handle and indicate exceptions respectively what exception class is and how to use it drawback of except
2、ion handling and useful advices10.1 Introduction What are Exceptions and Exception handling? Exceptions indicate problems that occur during a programs execution, and the problems are special that they occur infrequently. Exception handling means resolve exceptions and make the programs robust and fa
3、ult-tolerant( allow a program to continue executing or notify the user of the problem).10.1 Introduction When can we use Exception handling? After distinguishing exceptions from errors. Exception is a special kind of error that the user can not estimate and occurs infrequently. ( Once an error is ha
4、ndled, it is no longer an error. ) For example, when user want to create a file.Exceptions can be these:1. the disk is full 2. do not have permission to create a file. 10.1 Introduction 常见的异常 系统资源不足系统资源不足1)内存不足:不可以动态申请内存空间2)磁盘不足:不能创建新的文件 用户操作导致运算关系不正确用户操作导致运算关系不正确如分母为0、数学运算溢出、数组越界、参数类型不能转换等。 异常的特点 偶
5、然性和可预见性异常的存在和出现可以预见,但不会总是发生。 严重性一旦异常产生,程序可能终止或运行结果未知。10.1 Introduction 异常处理方法 不做处理(很多程序都是这样,但不建议) 发布错误信息,然后终止程序的运行(在C语言中,往往这样处理) 适当的处理异常,使程序可以继续运行(最佳的选择)10.1 Introduction Exception Handling Mechanism(异常处理机制)1. throwing an exception(抛出异常信号)(抛出异常信号): Some library software or your code signals(发出信号) th
6、at something unusual has happened.2. handling the exception: At some other place in your program you place the code that deals with the exceptional case.10.2 try, catch and throw Keyword try followed by braces( ) Should enclose Statements that might cause exceptions Statements that should be skipped
7、 in case of an exceptionExample:try int* ptr = new int1000000000000000 ;10.2 try, catch and throw Keyword catch( Catch Handlers )Immediately follow by a try block. ( Every try block has one or more catch handlers )Example:try infile.open( 1.txt, ios:in ) ; if ( infile.fail() ) throw -1 ; / /抛出整型对象,下
8、面会具体讲抛出整型对象,下面会具体讲catch ( int i ) / / 捕获捕获 int int 型的对象型的对象 cout “Exception:can not open file” endl ; Exception:can not open file Output Keyword catch( Catch Handlers )Executes if exception parameter type matches the exception thrown in the try block.(catch 按其在try块后出现的顺序被检查,最先匹配的catch块将处理该异常)10.2 tr
9、y, catch and throwtry / code to trythrow 1.2 ; / float typefloat typecatch ( int ) / handle exceptions of intcatch ( float ) / handle exceptions of floatcatch ( ExceptionClass ) / handle exceptions of ExceptionClass./* code to execute if no exception or catch handler handled exception*/First match w
10、ins!仅仅通过仅仅通过类型类型而不是通过而不是通过值值来来匹配的,匹配的,所以catch块的参数可以没有参数名称,只需要参数没有参数名称,只需要参数类型。类型。异常处理的思想函数g()调用者 调用关系 异常传播方向 函数h() 引发并抛出异常函数f()捕获并处理异常10.2 try, catch and throw10.2 try, catch and throw 栈展开抛出异常的时候,将暂停当前函数的执行,开始查找匹配的catch子句。首先检查throw本身是否在try 块内部,如果是,检查与该catch相关的catch子句,看是否其中之一与抛出对象相匹配。如果找到匹配的 catch,就处
11、理异常;如果找不到,就退出当前函数(释放当前函数的内在并撤销局部对象),并且继续在调用函数中查找。这个过程,称之为栈展开(stack unwinding),沿嵌套函数调用链继续向上,直到为异常找到一个catch子句。只要找到能够处理异常的catch子句,就进入该 catch子句,并在该处理代码中继续执行。当catch结束的时候,在紧接在与该 try 块相关的最后一个 catch 子句之后的点继续执行。10.2 try, catch and throw 异常与析构函数 因异常而退出函数时,编译器保证适当地撤销局部对象 如果一个块直接分配资源,而且在释放资源之前发生异常,在栈展开期间将不会释放该资
12、源。例如,一个块可以通过调用 new 动态分配内存,如果该块因异常而退出,编译器不会删除该指针,已分配的内在将不会释放。 析构函数应该从不抛出异常 在为某个异常进行栈展开的时候,析构函数如果又抛出自己的未经处理的另一个异常,将会导致调用标准库terminate函数。一般而言,terminate函数将调用abort函数,强制从整个程序非正常退出。 标准库类型都保证它们的析构函数不会引发异常10.2 try, catch and throw Keyword catch( Catch Handlers )Process uncaught and unexpected exceptions.For t
13、hese exceptions that we do not know but have to handle, we can use catch( ) statement to catch all type of operands. try int* ptr = new int1000000000000000 ; catch( int ) /*/ catch( ) / catchcatch all type of operands to to handlehandle unexpected exception cout “unexpected exception occurs endl ; u
14、nexpected exception occursOutput 10.2 try, catch and throw catch异常说明符匹配原则异常与 catch 异常说明符匹配的规则比匹配实参和形参类型的规则更严格,大多数转换都不允许除下面几种可能的区别之外,异常的类型与 catch 说明符的类型必须完全匹配: 允许从非 const 到 const 的转换。也就是说,非 const 对象的 throw可以与指定接受 const 引用的 catch 匹配。 允许从派生类型型到基类类型的转换。 将数组转换为指向数组类型的指针,将函数转换为指向函数类型的适当指针。 在查找匹配 catch 的时候
15、,不允许其他转换。具体而言,既不允许标准算术转换(比如不允许int到double的转换),也不允许为类类型定义的转换。 10.2 try, catch and throw Keyword throwfollowed by an operand representing the type of exception. 1. The throw operand can be of any type throw 表达式可以抛出任何类型的对象,包括内建类型(int,float 等)2. If the throw operand is an object, it is called an exceptio
16、n object. (常用) Keyword throwtry throw -1 ; /throw 表达式很像return 语句,在throw处立即返回 catch( int ) cout exception caught ! endl ; catch( ) / 使用 ()可捕捉任意类型的异常,用来处理未知的异常10.2 try, catch and throw exception caught !Output 10.2 try, catch and throw Exception Specifications在函数的声明中列出可能抛出的异常类型Example:void fun() throw
17、( int, float, ExceptionClass ) ; /可抛出可抛出int、float、ExceptionClass类型的异常类型的异常2. 若无声明,则可以抛出任何类型的异常 void fun()3. 不抛出任何类型的异常的声明如下:void fun() throw() ;表示不抛出异常,如果fun里面的异常没有被捕捉到,程序终止?10.2 try, catch and throw Example.Since constructors are not able to return values, we often use exception handling to inform
18、the caller whether the construction is a success or not.class A public: A() infile.open( 1.txt, ios:in ) ; if ( infile.fail() ) throw -1 ; private: ifstream infile ; ;int main() try A a ; catch( int ) cout exception: constructor failed endl ; return 0 ; exception: constructor failedOutput 10.2 try,
19、catch and throw 分层嵌套.当在低层的trycatch结构块中不能匹配到相同类型的catch block时,它就会到上层的trycatch块中去寻找匹配到正确的catch block异常处理模块。int main() try /这里是嵌套的trycatch结构块 try cout “ 准备抛出一个double数据类型的异常. endl; throw 0.5; catch( int& value ) cout 在 catch block 中, int数据类型处理异常错误。” endl; catch( double& d_value ) cout 在 catch block 中, d
20、ouble数据类型处理异常错误。” endl; return 0; 10.2 try, catch and throw 分层嵌套.分层嵌套的trycatch块是可以跨越函数作用域的。void Func() try /这里实际上也是嵌套在里层的trycatch结构块 cout “在 try block 中, 准备抛出一个int数据类型的异常.” endl; /由于这个trycatch块中不能找到匹配的catch block,所以 /它会继续查找到调用这个函数的上层函数的trycatch块。 throw 1; catch( float& value ) cout 在 catch block 中,
21、int数据类型处理异常错误。” endl; int main() try Func(); cout 在 try block 中, 准备抛出一个double数据类型的异常. endl; throw 0.5; catch( double& d_value ) cout “在 catch block 中, double数据类型处理异常错误。” endl; catch( int& value ) /这个例子中,Func()函数中抛出的异常会在此被处理 cout 在 catch block 中, int数据类型处理异常错误。” endl; return 0; 10.3 Exception Class D
22、efining an Exception Class Because a throw-statement can throw a value of any type, it is common to define a class whose objects can carry the kind of information you want thrown to the catch-block. A more important reason for a specialized exception class is so you can have a different type to iden
23、tify each possible kind of exceptional situation. An exception class is just a class that happens tobe used as an exception class.10.3 Exception Class Defining an Exception ClassExampleclass ExceptionClasspublic:ExceptionClass() cout“Exception occurs !”endl;int main () try /实例化类ExceptionClass的对象,并将其
24、抛出 throw ExceptionClass() ; /捕获类ExceptionClass的对象 catch ( ExceptionClass ) cout “Excepiton caught !” endl ; return 0 ; Exception occurs ! Exception caught !Output 10.3 Exception ClassAnother example/ Class DividByZeroException to be used in exception handling for throwing an exception on a division
25、by zeroclass DivideByZeroException public:DivideByZeroException() :message( “attempted to divide by zero” )const char* what() const return message ; private:const char* message ; ;10.3 Exception Class/ 使用示例try throw DivideByZeroException() ; /调用类DivideByZeroException的构造函数,/实例化类DividByZeroException的一
26、个对象,并将其抛出catch ( DivideByZeroException ex ) /捕获类DividByZeroException的对象 cout “Exception occurrs: ” ex.what() endl ; /调用成员函数 Exception occurs: attempted to divide by zeroOutput 10.3 Exception Class 标准C+异常类一个基类:一个基类:exception(所有异常的基类)(所有异常的基类)class exception public: exception() throw() ; exception( co
27、nst exception& rhs ) throw() ; virtual exception() throw() ; virtual const char* what() const throw() ; ;两个派生的异常类两个派生的异常类logic_erro 报告程序的逻辑错误,可在程序执行前被检测到报告程序的逻辑错误,可在程序执行前被检测到 runtime_erro 报告程序运行错误,只有在运行时才能被检测到报告程序运行错误,只有在运行时才能被检测到10.3 Exception Class 标准C+异常类 (需要 #include )逻辑错误类domain_error 报告违反了前置条件invalid_argument 报告函数的参数无效out_of_range 报告参数越界 运行时错误类bad_alloc报告存储分配错误range_error 报告计算中的范围错误overflow_error 报告算术上溢出underflow_error报告算术下溢出10.3 Exception Class 标准C+异常类 (需要 #include )其类层次如下:10.3 Exception Class 标准C+异常类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年沪科新版八年级地理上册阶段测试试卷
- 2025中国铁路北京局集团限公司招聘普通高校毕业生868人(二)高频重点提升(共500题)附带答案详解
- 2025中国联通广西分公司招聘97人高频重点提升(共500题)附带答案详解
- 2025中国神华系统内招聘拟录取人员高频重点提升(共500题)附带答案详解
- 2025中国电信福建公司春季招聘148人高频重点提升(共500题)附带答案详解
- 动物炭黑、动物胶及其衍生物相关行业投资方案范本
- 2025中国旅游集团战略发展部副总经理公开招聘1人高频重点提升(共500题)附带答案详解
- 2025中国南水北调集团新能源投资限公司下属经营区域招聘5人高频重点提升(共500题)附带答案详解
- 2025中国人民财产保险股份限公司自贡市分公司招聘5人(四川)高频重点提升(共500题)附带答案详解
- 2025中共聊城市委组织部所属事业单位公开招聘(2025年)高频重点提升(共500题)附带答案详解
- 《工会法律工作实务》课件
- 四川对口高职医药卫生一类模拟题及答案
- 北京市西城区2023-2024学年七年级上学期期末数学试题
- 煤矿运输班组长反“三违”培训课件
- 公立中医医院绩效考核工作方案(28篇)
- 渔业法与监管制度
- 编码规则(标准)
- 家政培训行业的发展趋势与前景分析
- 定制酒项目投资分析及可行性报告
- 售后客服年终工作总结汇报
- 教师专业化发展经费保障制度
评论
0/150
提交评论