310 likes | 582 Views
C++ 程序语言设计. Chapter 15: 异常处理. 意外情况的处理. 打开一个不可用的文件 请求过多内存 遭遇不能容忍的值 除数为零 ……. 示例. 计算两个数的调和平均数 两个数字倒数的平均值的倒数 2.0 * x * y / (x + y) 如果 y 是 x 的负值,则上述公式将导致被零除. 方法一. 调用 abort() 函数 原型位于 cstdlib 中 典型实现是向标准错误流( cerr )发送消息,然后直接终止程序 参看代码: error1.cpp 为避免异常终止,应在调用之前检查 x 、 y 的值
E N D
C++程序语言设计 Chapter 15: 异常处理
意外情况的处理 • 打开一个不可用的文件 • 请求过多内存 • 遭遇不能容忍的值 • 除数为零 • ……
示例 • 计算两个数的调和平均数 • 两个数字倒数的平均值的倒数 • 2.0 * x * y / (x + y) • 如果y是x的负值,则上述公式将导致被零除
方法一 • 调用abort()函数 • 原型位于cstdlib中 • 典型实现是向标准错误流(cerr)发送消息,然后直接终止程序 • 参看代码:error1.cpp • 为避免异常终止,应在调用之前检查x、y的值 • 依靠程序员来执行这种检查是不安全的
方法二 • 用函数的返回值来指出问题 • 使用指针参数或引用参数来将值返回给调用程序,并指出成功还是失败 • 参看代码:error2.cpp • 避免了错误输入导致的恶果,使用户可以继续输入
异常机制 • C++异常机制是对程序运行过程中发生的异常情况的一种响应。 • 对异常的处理由三个组成部分: • 引发异常 • 捕获有处理程序的异常 • 使用try块
引发异常 • throw语句 • 命令程序跳到另一条语句 • 表示引发异常,紧随其后的值指出了异常的特征
捕获有异常处理程序的异常 • catch关键字表示捕获异常 • 以catch开头,随后是位于括号中的类型声明,指出异常处理器要响应的异常类型,然后是花括号括起来的代码块,指出要采取的措施
使用try块 • try块标识其中特定的异常可能被激活的代码块 • 后面跟一个或多个catch块 • 关键字try后面是一个由花括号括起的代码块,表明需要注意这些代码引起的异常。 • 参看代码:error3.cpp
异常的多功能性 • try块使得能够选择检查哪些代码的异常,而处理程序使得能制定采取何种措施。 • 可以异常规范来限定函数定义,指出函数将引发哪些类型的异常 • catch块可以处理多个异常源
异常规范 • 异常规范由关键字throw和紧随其后的异常类型列表组成,异常类型被括在括号中,并用逗号隔开。 double hmean (double a, double b) throw (const char *) • 首先,它告诉编译器,该函数引发了哪些类型的异常 • 其次,提醒阅读该原型的人,该函数引发异常,应提供try块和处理程序 • 如果异常规范中的括号为空,表明该函数不会引发异常。
示例 • 参看代码:error4.cpp • 增加计算两个数的几何平均数,即乘积的平方根 • 参数为负数,可能引发异常
堆栈解退 • 假设try块没有直接调用引发异常的函数,而是调用对引发异常的函数进行调用的函数,如果函数因为出现异常而终止,则程序释放堆栈中的内存,且不会在释放堆栈的第一个返回地址后停止,而是继续释放,直到找到一个位于try块中的返回地址,随后控制权将转到块尾的异常处理程序。 • 处理try块和throw之间整个函数调用序列放在堆栈中的对象。
异常和类 • 使用异常的通常做法是,将异常作为对象来引发,并通过引用来捕获。 • 当异常为类时,则将异常类型定义为嵌套类,这样不仅可以指出异常源,而且有助于防止名称冲突。
异常和继承 • 继承和异常交互的方式有两种: • 如果类以公有的方式嵌套了异常类,则派生类将继承这些异常类 • 可以从现有的异常类派生出新的异常类
Exception类 • exception头文件定义了exception类,可以作为其他异常类的基类。 • 其中有一个名为what()的虚拟成员函数,返回一个字符串,随实现而定。 • new引发bad_alloc异常,头文件new包含了bad_alloc类的声明,它是从exception类公有派生而来的 • 参看代码:newexcp.cpp
异常的缺点 • 增加程序代码 • 降低运行速度 • 编译器的支持并没有完全成熟 • 学习的复杂性较高
XML概述 • 基本概念 XML(eXtensible Markup Language)是Web上的一种表示结构化信息的标准文本格式。 - SGML(Standard Generalized Markup Language)的一个子集,具备SGML的核心特征:可扩展性,结构化,有效性。 - 具备HTML的简单性 - 使内容与表现分离 - 提供了一种方案,但不是最终解决方案,没有通用的XML浏览器
XML基本语法 XML文件的基本构成单元是实体(Entity),包括解析的和未解析的(原始文本) <?xml version=“1.0” encoding=“utf-8” ?> 处理指令 <! DOCTYPE students SYSTEM “students.dtd”> 文件类型声明 <! ENTITY apos “'”> 实体引用 <students> 标记 <!-- comment goes here --> 注释 … … <! [CDATA[ CDATA片段 <tag/> ]]> </students>
XML的数据模型 • 一种schema技术,描述XML文件的信息结构,建立文件内容的约束,用于有效性验证,具体包括: - 定义元素及其排列和嵌套顺序 - 定义元素的数据类型 • 数据模型定义方法 - DTD(Document Type Definition) - XML Schema
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>
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。
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>
XML的处理(1) 解析和验证 - 第一种分类 - 标准解析器,检查文件是否结构良好 - 验证解析器,检查文件是否符合数据模型 - 第二种分类 - 生成解析树的解析器 - 将文件作为平面结构的解析器
XML的处理(2) • XML文件的处理过程 PROCESSING AGENT XML PARSER XML DOC Display Device PARSER TREE DTD STYLE SHEET RENDERING AGENT
XML的处理(3) • 典型的解析树 Document Version DocType Entity Element Comment Element Text
XML的处理(4) DOM(Document Object Model)文件对象模型 提供一种访问和操纵XML的方法。使用解析树可以访问树中节点。 W3C DOM包含三个层次:level0 ~ level3 SAX(Simple API for XML)使用流方式来处理XML,是一个XML解析器接口,采用回调技术。灵活高效易于掌握。绝大多数SAX编程使用java。目前是1.0版本
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);
XML的处理(6) XML脚本 为开发由XML数据驱动的基于Web的交互应用提供了便捷的方法。能存取XML文件的逻辑结构。 脚本语言与网页内容紧密相连,可以直接存取网页的任何部分。 可使用的脚本语言: - JavaScript - VBScript - Perl等
使用XML操作数据 对XML文件内容的查询,返回文件信息的一种方法 DSO(Data Source Object)数据源对象,小型数据库的客户端对象,一系列的ActiveX对象 XQL(XML Query Language)是一种对XML文件进行查询的方法。从被搜索文件中获得一个封装在<xql:result>元素中的接点集。
在数据库管理系统中使用XML 当前XML在数据库管理方面的用途 - 备份和归档数据 - 作为不同数据库之间的交换数据的方式 - 用于显示 - 本身作为数据存储方式 - 数据库表格不能很好适应要求 - 数据库字段必须是定长的 - 对搜索速度、数据类型要求不高 - 小型可伸缩数据库