1 / 31

C++ 程序语言设计

C++ 程序语言设计. Chapter 15: 异常处理. 意外情况的处理. 打开一个不可用的文件 请求过多内存 遭遇不能容忍的值 除数为零 ……. 示例. 计算两个数的调和平均数 两个数字倒数的平均值的倒数 2.0 * x * y / (x + y) 如果 y 是 x 的负值,则上述公式将导致被零除. 方法一. 调用 abort() 函数 原型位于 cstdlib 中 典型实现是向标准错误流( cerr )发送消息,然后直接终止程序 参看代码: error1.cpp 为避免异常终止,应在调用之前检查 x 、 y 的值

amory
Download Presentation

C++ 程序语言设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C++程序语言设计 Chapter 15: 异常处理

  2. 意外情况的处理 • 打开一个不可用的文件 • 请求过多内存 • 遭遇不能容忍的值 • 除数为零 • ……

  3. 示例 • 计算两个数的调和平均数 • 两个数字倒数的平均值的倒数 • 2.0 * x * y / (x + y) • 如果y是x的负值,则上述公式将导致被零除

  4. 方法一 • 调用abort()函数 • 原型位于cstdlib中 • 典型实现是向标准错误流(cerr)发送消息,然后直接终止程序 • 参看代码:error1.cpp • 为避免异常终止,应在调用之前检查x、y的值 • 依靠程序员来执行这种检查是不安全的

  5. 方法二 • 用函数的返回值来指出问题 • 使用指针参数或引用参数来将值返回给调用程序,并指出成功还是失败 • 参看代码:error2.cpp • 避免了错误输入导致的恶果,使用户可以继续输入

  6. 异常机制 • C++异常机制是对程序运行过程中发生的异常情况的一种响应。 • 对异常的处理由三个组成部分: • 引发异常 • 捕获有处理程序的异常 • 使用try块

  7. 引发异常 • throw语句 • 命令程序跳到另一条语句 • 表示引发异常,紧随其后的值指出了异常的特征

  8. 捕获有异常处理程序的异常 • catch关键字表示捕获异常 • 以catch开头,随后是位于括号中的类型声明,指出异常处理器要响应的异常类型,然后是花括号括起来的代码块,指出要采取的措施

  9. 使用try块 • try块标识其中特定的异常可能被激活的代码块 • 后面跟一个或多个catch块 • 关键字try后面是一个由花括号括起的代码块,表明需要注意这些代码引起的异常。 • 参看代码:error3.cpp

  10. 异常的多功能性 • try块使得能够选择检查哪些代码的异常,而处理程序使得能制定采取何种措施。 • 可以异常规范来限定函数定义,指出函数将引发哪些类型的异常 • catch块可以处理多个异常源

  11. 异常规范 • 异常规范由关键字throw和紧随其后的异常类型列表组成,异常类型被括在括号中,并用逗号隔开。 double hmean (double a, double b) throw (const char *) • 首先,它告诉编译器,该函数引发了哪些类型的异常 • 其次,提醒阅读该原型的人,该函数引发异常,应提供try块和处理程序 • 如果异常规范中的括号为空,表明该函数不会引发异常。

  12. 示例 • 参看代码:error4.cpp • 增加计算两个数的几何平均数,即乘积的平方根 • 参数为负数,可能引发异常

  13. 堆栈解退 • 假设try块没有直接调用引发异常的函数,而是调用对引发异常的函数进行调用的函数,如果函数因为出现异常而终止,则程序释放堆栈中的内存,且不会在释放堆栈的第一个返回地址后停止,而是继续释放,直到找到一个位于try块中的返回地址,随后控制权将转到块尾的异常处理程序。 • 处理try块和throw之间整个函数调用序列放在堆栈中的对象。

  14. 异常和类 • 使用异常的通常做法是,将异常作为对象来引发,并通过引用来捕获。 • 当异常为类时,则将异常类型定义为嵌套类,这样不仅可以指出异常源,而且有助于防止名称冲突。

  15. 异常和继承 • 继承和异常交互的方式有两种: • 如果类以公有的方式嵌套了异常类,则派生类将继承这些异常类 • 可以从现有的异常类派生出新的异常类

  16. Exception类 • exception头文件定义了exception类,可以作为其他异常类的基类。 • 其中有一个名为what()的虚拟成员函数,返回一个字符串,随实现而定。 • new引发bad_alloc异常,头文件new包含了bad_alloc类的声明,它是从exception类公有派生而来的 • 参看代码:newexcp.cpp

  17. 异常的缺点 • 增加程序代码 • 降低运行速度 • 编译器的支持并没有完全成熟 • 学习的复杂性较高

  18. XML概述 • 基本概念 XML(eXtensible Markup Language)是Web上的一种表示结构化信息的标准文本格式。 - SGML(Standard Generalized Markup Language)的一个子集,具备SGML的核心特征:可扩展性,结构化,有效性。 - 具备HTML的简单性 - 使内容与表现分离 - 提供了一种方案,但不是最终解决方案,没有通用的XML浏览器

  19. XML基本语法 XML文件的基本构成单元是实体(Entity),包括解析的和未解析的(原始文本) <?xml version=“1.0” encoding=“utf-8” ?> 处理指令 <! DOCTYPE students SYSTEM “students.dtd”> 文件类型声明 <! ENTITY apos “&#39;”> 实体引用 <students> 标记 <!-- comment goes here --> 注释 … … <! [CDATA[ CDATA片段 <tag/> ]]> </students>

  20. XML的数据模型 • 一种schema技术,描述XML文件的信息结构,建立文件内容的约束,用于有效性验证,具体包括: - 定义元素及其排列和嵌套顺序 - 定义元素的数据类型 • 数据模型定义方法 - DTD(Document Type Definition) - XML Schema

  21. DTD和XML Schema • DTD最初用于SGML,有特定语法,简洁紧凑,得到广泛支持,支持简单的数据类型描述(字符串)。 • XML Schema使用XML词表,易于理解,对数据精确描述,支持丰富的数据类型描述,且允许扩展,是W3C的一个草案,IE5支持其一个子集。 XML Schema示例: <ElementType name = “name” content=“textOnly” dt:type = “char”/> <ElementType name=“student” model=“closed” content=“eltOnly” order=“seq”> </ElementType>

  22. XML的格式化 • 对XML文件内容进行样式格式化以用于显示 - CSS(Cascading Style Sheets)层叠样式表 用于格式化HTML,仅用于固定内容的XML文件的简单样式化。可与DOM/脚本语言结合使用,目前主要使用CSS1,CSS2没有得到主流浏览器的支持。 - XSL(eXtensible Style Language)扩展样式语言 基于DSSSL(文件样式语义和规范语言),包括: - XSLT(XSL Transformation)XSL转换 - XSLFO(XSL Formatting Objects)XSL格式化对象 W3C草案,将可能取代CSS。

  23. XSLT • 对XML进行格式转换,是W3C的推荐组件 - 采用模板,模式;是一种小型查询语言 - IE5支持XSLT(也支持部分CSS1) XSLT示例: <xsl:template match = “/”> <xsl:apply-templates select = “name”/> </xsl:template> <xsl:template match = “name”> <h2><xsl:value-of/></h2> </xsl:template>

  24. XML的处理(1) 解析和验证 - 第一种分类 - 标准解析器,检查文件是否结构良好 - 验证解析器,检查文件是否符合数据模型 - 第二种分类 - 生成解析树的解析器 - 将文件作为平面结构的解析器

  25. XML的处理(2) • XML文件的处理过程 PROCESSING AGENT XML PARSER XML DOC Display Device PARSER TREE DTD STYLE SHEET RENDERING AGENT

  26. XML的处理(3) • 典型的解析树 Document Version DocType Entity Element Comment Element Text

  27. XML的处理(4) DOM(Document Object Model)文件对象模型 提供一种访问和操纵XML的方法。使用解析树可以访问树中节点。 W3C DOM包含三个层次:level0 ~ level3 SAX(Simple API for XML)使用流方式来处理XML,是一个XML解析器接口,采用回调技术。灵活高效易于掌握。绝大多数SAX编程使用java。目前是1.0版本

  28. XML的处理(5) W3C DOM的三个级别: - level 0:重申了JavaScript的语法,用于操纵HTML。 - level 1:允许访问XML文件的所有部分,不允许访问DTD或与文件关联的样式表。 - level 2:允许对DTD、样式表和名字空间的访问,正在研究的模型。 一个简单示例: var comment = myDoc.createComment(“comment”); var rootEl = myDoc.documentElement dummy = rootEl.appendChild(comment);

  29. XML的处理(6) XML脚本 为开发由XML数据驱动的基于Web的交互应用提供了便捷的方法。能存取XML文件的逻辑结构。 脚本语言与网页内容紧密相连,可以直接存取网页的任何部分。 可使用的脚本语言: - JavaScript - VBScript - Perl等

  30. 使用XML操作数据 对XML文件内容的查询,返回文件信息的一种方法 DSO(Data Source Object)数据源对象,小型数据库的客户端对象,一系列的ActiveX对象 XQL(XML Query Language)是一种对XML文件进行查询的方法。从被搜索文件中获得一个封装在<xql:result>元素中的接点集。

  31. 在数据库管理系统中使用XML 当前XML在数据库管理方面的用途 - 备份和归档数据 - 作为不同数据库之间的交换数据的方式 - 用于显示 - 本身作为数据存储方式 - 数据库表格不能很好适应要求 - 数据库字段必须是定长的 - 对搜索速度、数据类型要求不高 - 小型可伸缩数据库

More Related