(计算机应用技术专业论文)异常处理机制研究.pdf_第1页
(计算机应用技术专业论文)异常处理机制研究.pdf_第2页
(计算机应用技术专业论文)异常处理机制研究.pdf_第3页
(计算机应用技术专业论文)异常处理机制研究.pdf_第4页
(计算机应用技术专业论文)异常处理机制研究.pdf_第5页
已阅读5页,还剩50页未读 继续免费阅读

(计算机应用技术专业论文)异常处理机制研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 弋, 3l | i 乙 j ,引入异常处理机制的目的在于增强系统的健壮性和可靠性以及代码的可理解 睦,。异常是正常情况之外的情形,并不一定意味着错误。异常的发生非常频繁,甚 至被公认为非常健壮的操作系统,也经常出现异常。对异常处理比正常情况要求更 高,不适当的处理将导致系统崩溃。现在系统设计人员和软件工程师都认识到了异 常处理的重要性。) 在软件工程任务中,使用控制流、数据流、控制依赖等程序分析 技术分析和理解程序,并把得到的信息用于任务中。当前许多流行的程序设计语言 提供了完善的异常处理机制,本文以j a v a 语言为例,讨论了程序中的异常结构对上 述分析技术的影响。更进一步本文还以j a v a 为平台详细分析了异常机制给编译程 笋的优化工作带来的影响。分忻了异常对局部优化、循环优化和全局优化造成效率 降低的最根本原因在于增加了异常处理模块从而增加了优化工作中基本块的数量。 年从编译程序优化工作的角度出发,建i j j a v a 程序员在使用异常机制进行程序开发 时,尽量给出异常的精确类型。目前,开发和运行企业过程的最好工具是工作流管 理系统,对于企业这样复杂的应用系统,出现异常是非常频繁和正常的情况,但企 业要求工作流管理系统不仅在正常情况下发挥作用,而且需要灵活地处理各种异常 情况。在本文的最后一章设计了旅行社业务的异常处理机制,它使用j e c a 规则描述 导常处理,同时采用基于c b r 的异常处理机制提高系统的灵活性和柔性,增强系统处 理异常的能力。 控职, 析“分阢 流p 据 , 数统,系析流分作 流工 制、 0 控化, 厂优性,局发全 并 ,(也象优对环向循 面 ,p 乙他优n 部,局 制,八 机块理本处基 常 ,异析:分词赖键依关制 a b s tr a c t i no r d e rt oe n h a n c et h er e li a bjlit yo fs o f t w a r es y s t e m si ti si m p o r t a n t t oc a t c ht h ee r r o r sa tr u nt i m eb ye x c e p t i o nh a n d l i n g t h eo t h e rs i g n i f i c a n t b e n e f i to fe x c e p t i o n si st h a tt h e yc l e a nu pe r r o rh a n d i n gc o d es ot h a tt h e p r o g r a m m e rc a ne a s i l yr e a da n d m a i n t a i nt h es o u r c ec o d e t h i sp a p e rp r e s e n t s ab r i e fi n t r o d u c t i o nt ot h e c o n c e p t o fe x c e p t i o na n dt h em e t h o d o l o g yo f e x c e p t i o nh a n d l i n g a n a l y s i st e c h n i q u e ,s u c ha s c o n t r o lf l o w ,d a t af l o w , c o n t r o ld e p e n d e n c e ,a r eu s e df o rav a r i e t yo fs o f t w a r ee n g i n e e r i n gt a s ki n m a n ym o d e r nl a n g u a g e s ,e x c e p t i o ni se l a b o r a t e da saq u i t en a t u r a lm e c h a n i s m r h i s p a p e rd i s c u s s e s t h ee f f e c t so f e x c e p t i o no na n a l y s i st e c h n i q u eo f p r o g r a mi nj a v a f u r t h e r ,t h i sp a p e ra n a l y s e st h ee f f e c t st h a te x c e p t i o n s h a v eo n c o m p i l e ro p ti m i s a t i o ni nj a v a t h ep a p e rp r e s e n t st h em o s t i m p o r t c a t l s eo ft h ee f f e c t s ,t h ef u r t h e r ,t h ec a u s ei st h a tb a s i cb l o c ki n c r e a s e s b e c a u s eo fa d d i t i o n a l e x c e p t i o n a lh a n d l i n g i n t h ev i e wo f c o m p il e t o w ,i m i s a t i o n ,t h ep a p e rs u g g e s tt h a td e v e l o p e r ss h o u l du s ep r e c i s et y p eo f e x c e p t i o n sa sp o s s i b l ea st h e yc a ni nj a v a i nt h ep r e s e n t ,t h eb e s tt o o l i nd e v e l o p i n gb u s i n e s sp r o c e s si st h ew o r k f l o w m a n a g e m e n ts y s t e m e x c e p ti o n i sv e r yf r e q u e n ti nt h ea p p l i c a t i o no fb u s i n e s sp r o c e s s i ti sr e q u i r e dt h a t a p p l i c a t i o nd e a lw i t hav a r i o u so fe x c e p t i o n t h i sp a p e rp r e s e n t se x c e p t i o n h a n d l i n go fh o t e lb u s i n e s s i ta d o p t sj e c ar u l et om o d e ie x c e p t i o nh a n d l i n g , a n dc b r b a s e dt o i m p r o v ec a p a b i i i t y i n e x c e p t i o nh a n d li n g k e y w o r d :e x c e p t i o nh a n d l i n g ,j a v a ,o b j e c t o r i e n t e d ,c o n c u r r e n c y ,c o n t r o l f l o wa n a l y s i s ,d a t af l o wa n a l y s i s ,c o n t r o ld e p e n d e n c e a n a l y s i s ,b a s i cb l o c k , ;o c a lo p t i m i s a t i o n ,l o o p o p t i m i s a t i o n ,g l o b a lo p t i m i s a t i o n ,w o r k f l o ws y s t e m , e x c e p t i o nh a n d l i n g ,j e c a ,c b r 2 引言 引入异常处理机制的目的在于增强系统的健壮性和可靠性,目前系统设计 人员和软件工程师已深刻地认识到了异常处理的重要性c 墨堂墨垩堂堕堡奎銎 的情形,并不一定意味着错误。在比较复杂的系统中,异常不仅是非常重要的 而且发生频繁,甚至象操作系统这样被认为非常健壮的系统,异常也经常发生。 在实际中,即使系统发现并处理了大量的异常,大多数系统的崩溃仍然是由异 常引发的。分析数据也表明,对异常不适当的处理导致系统崩溃 i 。因对异常 处理的要求比正常情况更高,所以人们开始投入大量的精力研究异常。在二十 世纪七十年代,对异常处理的研究主要集中在语言设计内容上,但研究表明异 常并不仅限于程序设计语言,更多地发生在现实世界中。所以现在情况发生了 很大的变化,对异常的研究已经渗透到了许多方面,如系统结构、容错率计算、 独立性、系统规范、软件工程、面向对象程序设计语言、实时系统、分布式系 统等 2 。 在文献 3 中提出了并行程序设计语言( 支持协同操作和任务两个概念) 的 异常处理问题,研究了c 一语言的异常中断和恢复机制,建立了支持这两种异 常处理机制的统一模型。文献 4 基于面向对象和协同操作,从软件生命周期的 角度,把异常分为与应用相关、与设计相关、与运行相关的三种不同类型,对 异常的处理贯穿于整个软件生命周期,在不同阶段根据异常的类型对异常作相 应的处理。文献 5 6 研究了带有异常处理结构的程序分析技术,提出了异常 描述模型以及异常描述在程序分析技术中的使用规则,分析了带有异常处理结 构的程序控制流,文献 7 研究了分布系统、实时系统、多线程中的异常,它们 和顺序程序中的异常区别非常大。 本文根据国内外对异常的相关研究工作,从异常的起因一软件设计问题开 始,概述了异常处理机制,包括异常的抛出、捕获和传播。目前,许多j a v a 程 序员已开始使用异常处理机制,异常机制不仅减少了程序的代码量,而且将用 于描述具体操作的代码与专门纠正错误的代码分隔开,但是,异常处理机制可 能改变过程内部或过程之间的控制流,如果分析程序时不考虑异常结构,得到 的信息将是不准确的信息,当把这些信息用在结构测试、回归测试、静态程序 切片、动态程序切片、程序理解等软件工程任务时,可能导致严重的后果,因 此本文讨论异常对j a v a 程序分析技术的影响,提醒程序员在使用异常处理机制 时注意异常对程序分析技术的影响。另外,j a v a 语言非常适用于网络应用,它 已成为一种网络语言,从而使j a v a 技术成为当今世界上最重要信息技术之, 给整个信息技术带来许多变化和影响,但j a v a 语言为了实现上述优点而增加了 程序运行的时间开销,降低了执行速度,这是影响j a v a 进一步广泛应用的主要 原因。因此,在j a v a 语言推广的同时就开始研究各种提高j a v a 运行速度的方 法,这些方法概括起来有软件和硬件两种途径 1 4 。在软件方法中,由于j a v a 语言与平台无关,为了提高j a v a 的运行速度,人们不得不对j a v a 的编译器进 行大量研究。在研究j a v a 编译器时发现异常对编译器有很大影响 1 5 。本文通 过计算到达一定值数据流方程,分析了异常对j a v a 编译器优化的影响。最后根 据文献 2 7 提出了工作流系统旅行社定票业务的一种异常处理设计方案,从而 增强系统的健壮性和柔性。 篁= 童墨堂竺坚塑堂竖里一 第一章异常处理机制概述 本章主要介绍异常处理机制,包括异常的抛出、捕获、传播。 1 1 异常处理机制的起因一软件设计问题 不允许错误的代码真正运行起来是程序设计语言的设计宗旨之一。编译器 会尽可能地捕获问题。但有些问题只有在运行期间才会发生,这些问题可能是 编程错误,也可能是系统错误。这些问题必须在运行期间解决,让错误的缔结 者通过一些措施向接收者传递一些适当的信息,使其知道该如何正确地处理遇 到的问题。有些语言,通过检查反映错误状态的状态变量的值来检查错误;还 有一些语言需要每个函数返回自身运行是否正确的信息,在许多情况下,这是 通过检查函数返回的一个整型值实现的,正常情况和发生错误用不同的返回值 来表示。无论是检查反映错误状态的状态变量的值还是函数的返回值,都存在 下面的问题: ( 1 ) 要求程序员检查错误状态的状态变量的值或者函数的返回值,如果程序员 假设程序在没有错误的情况下运行而没有处理所有的错误,应用程序实际上充 满了各种潜在的错误,一旦出现错误,就会导致系统崩溃。 l 2 ) 程序员检查错误状态以及对错误进行处理的程序代码,虽然使得程序中的 错误减少,但同时使程序难以阅读,因为其中充满了错误检测语句。 ( 3 ) 由于程序可能遭遇各种各样的错误,设计人员不可能使程序包括所有的错 误处理。 ( 4 ) 因为错误状态的状态变量的值或者函数的返回值是在程序中进行检查的, 如果希望修改返回值和状态值必须修改程序,这并不是一件容易的事情。 为了解决错误处理中出现的上述问题,很多程序设计语言提供了异常处理 机制。异常机制包含两个方面:抛出异常和捕获异常。抛出一个异常意味着发 出一个错误信号,而捕获一个异常是指得到和处理抛出的错误信号。引入异常 处理机制简化了错误控制代码,不再需要在程序中检查一个特定的错误,然后 在程序的许多地方对其进彳亍控制,只需要在程序中的一个地方即异常控制器中 处理问题。这样不仅减少了代码量,而且将用于描述具体操作的代码与专门纠 6 复= 重量笪墼垄垫型塑蕉一 1 2 异常处理机制 异常指正常情况之外的一种情形,在问题发生时,可能不知道如何解决,但 可以肯定的是不能继续下去了,这时,必须由运行的语言或系统抛出异常,抛出 异常意味着出现了程序员不能按照正常的控制流处理的不正常的情况,抛出异常 的条件由程序员在源程序中指出。抛出异常后,异常传播机制将控制流转向异常 处理器,异常处理器是处理异常的指令集合。但实际处理问题时,当地可能没有 足够的信息,在这种情况下需要异常传播机制往上层传播异常寻找相应的异常处 理器,直到找到相应的异常处理器后,令其采取处理措施。 1 2 1 异常处理模式 处理模式规定控制流的转移方式,文献 8 中提供了异常处理机制可以采纳 的处理模式: 1 无条件转移模式:在程序设计语言中,无条件转移通过使用标号变量在块之间 转移,一个标号变量包括转移位置和栈指针,栈指针指向栈中包含转移位置的活 动已录。无条件转移把控制流转向g o t o 语句指定的标号变量所在位置。如果在 异常处理机制中采用无条件转移模式,需在异常处理器前加上标号,抛出异常后, 与执行程序设计语言中的g o t o 语句类似,无条件终止正在执行的操作而转向标 号位置开始执行。由于无条件转移机制本身难以维护和易产生错误的缺陷以及异 常处理本身对健壮性和高效性的需求,异常处理结构一般不采用无条件转移模 式。 2 中断模式:在中断模式中,抛出异常后,终止正在执行的块,控制流转向异常 处理器,完成异常处理后,控制流返回到调用点继续执行,与没有发生异常而程 序正常执行完警戒区中的内容一样。大多数程序设计语言中的异常处理结构采用 了这种模式 9 。 :3 恢复模式:在恢复模式中,抛出异常后,控制流转移到异常处理器,异常处理 器负责纠正当前未能完成的操作,然后回到抛出异常的位置继续执行。在这种模 式中调用异常处理器的过程与调用常规程序一样,不同之处在于执行完异常处理 器后回到抛出异常的位置继续执行,而抛出异常的位置不是固定的。恢复模式的 特点决定了该模式比较容易实现,因此,有些异常处理结构采用了恢复模式。 茎= 童墨塑丝墨垫型塑i l 图1 1 异常机制中的中断方法 3 恢复模式:在恢复模式中,抛出异常后,控制流转移到异常处理器,异常处理 器负责纠正当前未能完成的操作,然后回到抛出异常的位置继续执行。在这种模 式中调用异常处理器的过程与调用常规程序一样,不同之处在于执行完异常处理 器舌回到抛出异常的位置继续执行,而抛出异常的位置不是固定的。恢复模式的 特点决定了该模式比较容易实现,因此,有些异常钋硼结构桑田了恢复模式。 图1 2 异常机制中的恢复方法 r 1 重试模式:重试模式是具有特殊处理语义的中断模式,即失败后重新执行。在 这种模式中必须指出重新开始执行的位置,一般情况下,重新执行的位置是警戒 区的开始,其它位置没有什么实际意义。如果异常处理块中有多个异常处理器, 这些异常处理器的重试位置必须相同。由于这种模式可以用程序设计语言中的循 环结构和中断模式结合起来表示,所以异常处理结构不采用这种模式。 综上所述,异常机制的处理模式一般采用中断模式或恢复模式,但无论采用 哪种模式,都把异常处理代码与警戒区分开,警戒区代表一个特殊的代码区域, 蔓二童墨堂竺堡垫型堡整一 在此区域有可能产生异常,在警戒区的后面跟随异常处理器,如果运行警戒区中 代码时抛出异常,则通过异常传播机制寻找相应的异常处理器a 1 2 2 异常传播机制 异常传播机制将控制流转向异常处理器,传播模式有抛弃和恢复两种类型, 分别对应处理模式中的中断和恢复模式 3 。抛弃传播意味着控制流将不能再回 到抛出异常点,抛出异常点到处理器之间的代码不再被执行;恢复传播意味着控 制流将回到抛出异常点,但在处理器中可以改变为抛弃传播。抛弃传播和恢复传 播模式能够共存于同一个异常处理机制中。在声明或抛出异常时异常与传播模式 结合在一起,按照不同的机制进行传播,异常传播机制决定了如何寻找异常处理 器,一般情况下,异常处理机制采用动态传播机制,抛出异常后,到调用栈寻找 相应的处理器,文献 1 0 提供了一种通过词汇链寻找异常处理器的静态传播机 制,但静态传播机制很少被采用。 调用栈是被调用的方法序列,动态传播机制沿调用栈从抛出异常的方法开始 寻找处理异常的方法,直到找到合适的异常处理器为止。如果找到异常处理器表, 表中有多个异常处理器,传播机制没有指定具体的异常处理器,按照三个指导原 则从表中选择具体的处理器,一致性、最近、具体化。一致性指选择与传播的异 常相匹配的处理器:最近原则指传播路径上先找到的处理器:具体化原则指最接 近最精确的处理器。程序语言设计人员可以设置上述指导原则的优先权,共有6 种 选择方案,因此,在异常处理器表中选择处理器有6 * 6 种方案。通常一致性原则 优先权最高,最近原则次之,具体化原则最低。所以很多情况下选择的异常处理 器不一定是最合适的,它是距离抛出异常的方法最近的适当处理器( 一致性原则 的权限高于最近原则的权限,最近原则的权限又离于具体化原则的权限) 。 静态传播机制使用静态名字绑定,编译时异常与相应的异常处理器已联系在 一起。执行警戒区代码抛出异常后,沿着词典定义的词汇寻找相应的异常处理器。 1 2 3 异常与运行环境 异常处理机制与运行环境有关,并发环境下的异常处理机制比顺序环境下的 异常处理机制复杂得多。下面的执行属性与异常处理机制密切相关: 笙二童墨堂丝堡垫i!篓垄一一 f1 ) 执行状态:独立运行的状态信息,包括局部和全局数据,当前的执行位置, 活动记录。 ( 2 ) 线程:进程内部单一的一个顺序流,多个线程可以并发执行,改变执行状 态。 l3 ) 互斥:访问共享资源时的一种机制,顺序化并发执行的线程。 无论在顺序环境还是并发环境,异常处理机制对控制流的改变直接影响执行状 态,并发环境下与线程、互斥密切相关。 1 ,2 4 异常的层次 面向对象的继承是类层次的一个重要方面,在某个类下定义的子类将继承它 的父类的特性,并且能够具有它自己的特殊性质。异常的层次与面向对象中的类 层次相似,也具有继承性,因此程序员能够沿异常的层次,在多个层次位置上处 理异常。 通过继承来创建子异常类时,子类不能有多个父类,它只能继承一个父类 g 。因在声明异常时,将指定它的传播模式,从这个角度出发把异常分为抛弃 模式异常、恢复模式异常、抛弃恢复模式异常三种类型,一般情况下继承限于 同类异常,如果子类异常与父类异常的传播模式不同,当抛出的予类异常被父类 异常的处理器捕捉后,传播机制会导致一系列问题。 1 3 并行处理的异常机制 并行操作是以事务为单位进行的,事务是逻辑工作单位,是定义的一组操作 序列,具有原子性、一致性、隔离性和持续性。 1 3 1 并行处理的c a 模型 并行处理指的是在并行计算机上实现并行计算。并行体系结构、并行软件系 统和并行算法是并行处理的三个要素。在并行处理中,多个线程同时执行。文献 7 1 把协作( c a ) 事务的集合作为并行处理系统的动态结构模型。c a 事务中并 行的线程以通讯和协作为基础,通讯模式有共享变量模式和消息传递模式,c a 事务中的线程有共同的目标,每个线程仅完成总目标的一部分。c a 事务在一些 t 0 笙二童墨堂丝堡塑鱼! 塑垄 对象集合上执行一组操作,并发的多个线程合作完成这些操作,接口部分指定了 c a 事务要操作的对象和操作这些对象的线程。 为了提高容错能力,c a 事务把会话、事务和异常处理结合在一起,建立了 统一结构参考模型,会话保证协同操作活动( 活动是任务的基本执行步骤) 的封 闭性,控制线程之间的并行和通讯;事务保证访问共享变量时的一致性,确保c a 事务具有原子性、一致性、隔离性和持续性;异常处理提供系统发生软硬件错误 时的恢复机制,一旦c a 事务中某个线程抛出异常,必须通知其它线程,把线程 的控制流转向它们各自的异常处理器,同时把正在使用的外部变量恢复到正常状 态。c a 事务内部不能创建和结束线程。 1 3 2 并行处理的异常机制 并行处理的异常机制比顺序执行环境下传统的异常处理机制复杂得多,原因 如下:第一,异常处理过程包含并行成分;第二,分布环境的不同位置可能同时 抛出异常。但它与传统的异常处理机制也有许多相同之处,首先需要定义警戒区, 在警戒区后面跟着相应的异常处理器,如果警戒区代码执行时抛出异常,改变控 制流的模式也有无条件转移、中断、重试、恢复,使用最多的仍然是中断模式, 异常抛出后,相应的处理器必须捕捉异常并处理它,如果本地环境没有足够资源, 需要把异常传播到上面一层。 并行处理的异常处理机制包括下面几个方面 7 】: 第一,声明异常。c a 事务有两种类型异常,一种c a 事务内部能够处理, 在c a 事务定义中声明并指定处理的线程,另外种c a 事务内部无法处理,需 要传播到执行c a 事务的上层环境中处理,它在c a 事务接口中声明。 第二,异常处理和传播。如果c a 事务内部能够处理抛出的异常,则控制流 按照中断模式转向相应的异常处理器,c a 事务的所有参与线程都要调用相应的 处理器,如果c a 事务内部不能处理抛出的异常,传播机制选择一种传播模式把 异常传播到c a 事务的上层环境。传播模式有两种,一是预先定义或动态定义一 个主线程,由它负责向上层发送传播异常的信息,二是由抛出异常的线程负责发 送传播异常的消息。 第三,控制流的转向。异常抛出后按照中断模式转移控制流,控制流转移到 第一章异常处理机制概述 相应的异常处理器。与传统机制类似,首先在c a 事务内寻找异常处理器,如果 找不到相应的异常处理器,传播异常到上层寻找,直到找到相应的异常处理器为 上七a 第四,c a 事务的外部资源。c a 事务的线程通过共享外部资源协作,因此外 部资源的状态可能被改变,如果c a 事务抛出异常,应该把外部资源恢复到合理 状态。 第五,异常解析。处理c a 事务同时抛出多个异常时,一种方案是给每个异 常加权,然后按照异常的优先权先后处理这些异常。该方案很简单,但表示的相 关信息太少,因此常采用异常图描述并发控制中的异常。异常图描述了异常的层 次结构,把抛出的所有异常的析取作为异常解析。 墨三雯! 型! 堕直主塑墨堂一 第二章j a v a 语言中的异常 2 1j a v a 语言的特点 j a v a 语言定位于网络计算的计算机语言,它几乎所有的特点是围绕着这一中 心展开并为之服务的,这些特点使得j a v a 语言特别适合于用来开发网络上的应 用程序;另外,作为一种面世较晚的语言,j a v a 也集中体现和充分利用了若干当 代软件技术新成果,如面向对象、多线程等,这些也都在它的特点中有所反映。 1 平台无关性 j a v a 语言独特的运行机制使得它具有良好的二进制级的可移植性,利用 j a v a ,开发人员可以编写出与具体平台无关、普遍适用的应用程序,大大降低了 开发、维护和管理的开销。 2 面向对象 j a v a 是面向对象语言,面向对象语言如今已经成为最流行最重要的语言。它 主要的特征是支持封装性、继承性和多态性等。把复杂的数据和用于这些数据的 操作封装在一起,构成对象;对简单对象进行扩充、继承简单对象的特性,从而 设计出复杂的对象。通过对象的构造可以使面向对象程序获得强制式语言的有效 性,通过作用于规定数据的函数的构造可以获得应用式语言的灵活性和可靠性。 面向对象的技术较好地适应了当今软件开发过程中新出现的种种传统面向过程所 不能处理的问题,包括软件开发规模的扩大、升级加快、维护量增大以及分工日 趋细化、专业化和标准化等,是一种快速成熟、推广的软件开发方法。 c + + 也是面向对象的语言,但是为了与c 语言兼容,其中还包括了一些面向 过程的成分,j a v a 去除了c + + 中非面向对象的部分,程序编写过程就是设计、实 现类,定义其属性、行为的过程。 3 安全稳定 对网络上应用程序的另一个需求是较高的安全可靠性。用户通过网络获取并 在本地运行的应用程序必须是可信赖的,不会充当病毒或其他恶意操作的传播者 而攻击用户本地的资源;同时它还应该是稳定的,轻易不会产生死机等错误,使 得用户乐于使用。j a v a 特有的“沙箱机制是其安全性的保障,同时它除了c + + 中 星三童! ! :! 里亘! 塑墨生 易造成错误的指针,增加了自动内存管理等措施,保证了j a v a 程序运行的可靠 性。 4 支持多线程 多线程是当今软件技术的又一个重要成果,已成功应用在操作系统,应用开 发等多个领域。多线程技术允许同一个程序有两个执行线索,即同时做两件事情, 满足了一些复杂软件的需求。j a v a 不但内置多线程的功能,而且提供语言的多线 程支持,即定义了一些用于建立、管理多线程的类和方法,使得开发具有多线程 功能的程序变得简单、容易、有效。 2 2j a v a 语言中的异常机制 2 2 1 异常与异常类 异常又称为例外,是特殊的运行错误对象,对应着j a v a 语言特定的运行错 误处理机制,由于j a v a 程序是在网络环境中运行的,安全性成为需要首先考虑 的重要因素之一。为了能够及时有效地处理程序中的运行错误,j a v a 中引入了异 常和异常类。作为面向对象的语言,异常与其他语言要素一样,是面向对象规范 的一部分,是异常类的对象。异常在j a v a 中被称为e r r o r 或e x c e p t i o n ,是 t h r o w a b l e 或e r r o r 的子类,出现在程序中的原因是无法建立动态链接或运行时 出错。 j a v a 中定义了很多异常类,每个异常类都代表了一种运行错误,类中包含了 该运行错误的信息和处理错误的方法等内容 9 。除此之外,对于某个应用程序 所特有的运行错误,则需要编程人员根据程序的特殊逻辑在用户程序里自己创建 用户自定义的异常类和异常对象。这种用户自定义异常主要用来处理用户程序中 特定的逻辑运行错误。每当j a v a 程序运行过程中发现一个可识别的运行错误时, 即该错误有一个异常类与之对应时,系统都会产生个相应的该异常类的对象, 即产生一个异常。 2 2 2 异常机制 一旦一个异常对象产生了,系统中就有相应的机制来处理它,确保不会死机、 蔓三童 ! 型! 堕童主盟墨堂一 死循环或其他对操作系统的损坏,从而保证了整个程序运行的安全性,这就是j a v a 的异常处理机制。 j a v a 的异常处理机制由下面三部分组成,每一部分分别与j a v a 关键字联系 在一起: 1 t h r o w s :后面跟随全部潜在的异常类型,通知客户程序员该方法会抛出异 常,客户程序员可以方便地加以控制。当编写一个新的方法时,j a v a 程序员明确 指出调用者可以处理的潜在错误状态,所有这些潜在的错误状态都是方法定义中 的一部分,任何调用该方法中的代码必须处理这些错误状态,这由j a v a 编译器 强制完成。 2 t h r o w :后面跟随异常对象,表示抛出该异常对象给方法的调用者。用户 目定义的异常不可能依靠系统自动抛出,而必须借助于t h r o w 语句来定义何种情 况算是产生了此种异常对应的错误,并应该抛出这个异常的新对象。用t h r o w 语 句抛出异常时应注意下面两个问题: ( 1 ) 一般这种抛出异常的语句应该被定义为在满足一定条件时执行,例如把 t h r o w 语句放在i f 语句的i f 分支中,只有i f 条件得到满足,即用户定 义的逻辑错误发生时才执行。 ( 2 ) 含有t h r o w 语句的方法应在方法头定义增加如下部分:t h r o w s 异常类名 列表。这样做主要是为了通知所有欲调用此方法的方法,由于该方法包含 t h r o w 语句,所以要准备接收和处理它在运行过程中可能会抛出的异常。 如果方法中的t h r o w 语句不只一个,方法头的异常类名列表也不只一个,应该包 含所有可能产生的异常。由于系统不能识别和创建用户自定义的异常,所以需要 编程者在程序中的合适位置创建自定义异常的异常,并利用t h r o w 语句将这个新 异常对象抛出。 3 t r y - c a t c h f i n a l l y :将所有可能抛出异常的代码部分放入t r y 块中,将 所有异常及其处理部分紧跟在t r y 块的c a t c h 块中,f i n a l l y 块是可选的,如果 定义了f i n a l l y 块,不管有无异常产生,它都会被执行。因此,可以在把控制权 交给其它程序之前,用它处理任何必要的清理工作( 如关闭文件和流,释放系统 资源等等) 。f i n a l l y 块的目的是把系统恢复到应该处于的状态。 塑三雯 ! 型! 亘直主堕墨堕一 2 3 异常的处理 i a 。a 程序在运行时如果引发了一个可识别的错误,就会产生一个与该错误相 刺应的异常类对象,这个过程被称为异常的抛出。当一个异常被抛出时,应该有 专门的语句来接收这个被抛出的异常对象,这个过程被称为捕捉异常。当一个异 常类的对象被捕捉或接收后,用户程序就会发生流程的跳转,系统终止当前的流 程而跳转至专门的异常处理语句块,或直接跳出当前程序和j a v a 虚拟机回到操 作系统。 在j a v a 程序里,异常对象是依靠以c a t c h 语句为标志的异常处理语句来捕 捉和处理的。异常处理语句块又称为c a t c h 语句块,j a v a 语言规定,每个c a t c h 语句块都应该与一个t r y 语句块相对应,这个t r y 语句块用来启动j a v a 的异常 处理机制,可能抛出异常的语句,包括n h r o w 语句,凋用可能抛出异常方法的方 法调用语句,都应该在这个t r y 语句块中。 当异常发生时,j a v a 虚拟机采取如下措施:检查与当前方法相联系的c a t c h 予句表。每个c a t c h 子旬包含其有效指令范围,能够处理的异常类型,以及处理 异常的代码块地址。与异常相匹配的c a t c h 子旬应该符合下面的条件:造成异常 的指令在其指令范围之内,发生的异常类型是其能处理的异常类型的子类型。t r y 块产生的异常对象被第一个c a t c h 块所接收,则程序的流程就跳转到这个c a t c h 语句块中,语句块执行完毕后就退出当前的方法,t r y 块中尚未执行的语句和其 他的c a t c h 块将被忽略;如果t r y 块产生的异常与第一个c a t c h 块不匹配,系统 将自动转到第二个c a t c h 块进行匹配,如果第二个仍不匹配,就转向第三个直 到找到一个可以接收该异常对象的c a t c h 块,即完成流程的跳转。如果所有的 c a t c h 块都不能与当前的异常对象匹配,则说明当前方法不能处理这个异常对象, 程序流程将返回到调用该方法的上层。如果这个上层方法中定义了与所产生的异 常对象相匹配的c a t c h 块,流程就跳转到这个c a t c h 块中,否则继续回溯到更上 层的方法。如果所有的方法中都找不到合适的c a t c h 块,则由j a v a 运行系统来 处理这个异常对象。此时通常会终止程序的执行,退出虚拟机返回到操作系统, 系统调用一个缺省的异常处理模块,并在标准输出上打印相关异常信息。由于虚 拟机从第一个匹配的c a t c h 子句处继续执行,所以c a t c h 子旬表中的顺序是很重 要的。综上所述,j a v a 的异常处理主要包括捕捉异常、程序流程跳转和异常处理 6 语句块的定义。 检:异步异常检? 弋x 图2 1j a v a 的异常分类 无论是检测异常还是非检测异常,都分为系统定义异常和用户自定义异常, 系统定义异常通常对应着系统运行的错误。由于这种错误可能导致操作系统甚至 是接个系统的瘫痪,所以需要定义异常类来特别处理。由于定义了相应的异常, j a v a 程序即使产生些致命的错误,如引用空对象等,系统也会自动产生一个对 应的异常对象来处理和控制这个错误,避免其蔓延或产生更大的问题。系统定义 的异常主要用于处理系统可以预见的较常见的运行错误,程序员可以直接使用, 由表达式赋值、语句执行或t h r o w 语句抛出。用户自定义的异常用来处理程序中 可能产生的逻辑错误,使得这种错误能够被系统及时识别并处理,而不至于扩散 产生更大的影响,从而是用户程序更为强壮,有更好的容错性能,并使整个系统 更加安全稳定。创建用户自定义异常时,一般需要完成下面的工作: ( 1 1 声名一个新的异常类,使之以e x c e p t i o n 类或r u n t i m e e x c e p d o n 或其它某个已 兰三童! 型! 垦童塑墨堂 经存在的系统异常类或用户异常类为父类。 ( 2 ) 为新的异常类定义属性和方法,或重载父类的属性和方法,使这些属性和方法 能够体现该类对应的错误信息。 只有定义了异常类,系统才能够识别出特定的运行错误,才能及时控制和处 理运行错误,所以定义足够多的异常类是构建一个稳定完善的应用系统的重要基 础之一,用户定义的异常只能由t h r o w 语句抛出。 2 5 研究5 a v a 异常的意义 本文在研究程序设计语言中的异常机制时,选择j a v a 语言的原因如下: 第一,由j a v a 的面向对象、与平台无关、多线程等特点决定的。由于这些特 点使j a v a 语言越来越受欢迎。 第二,引入异常机制的目的在于帮助开发人员得到健壮的系统,但异常本身 比较复杂并且具有不可预测性 1 1 ,为了更好使用异常,必须先研究异常。 第三,分析了大量j a v a 应用程序的统计结果显示异常结构在j a v a 程序中占有 重要地位,表2 1 f 6 歹l j 出了j a v a 程序中使用异常结构的情况。根据调查表计算出 带有t r y 和t h r o w 语句的程序分别占总程序数的2 3 3 和2 4 5 ,由此看出研究j a v a 中的异常机制是非常必要的。 第四,众所周知,程序中的c o n t i n u e 和g o t o 语句能够改变一个过程内部的 控制流,e x i t 语句能够改变过程之间的控制流,程序中的异常结构同样会改变过 程内部和过程之间的控制流,在分析程序时,如果不考虑异常结构得到的将是不 准确的分析信息,当把这些信息用于一些软件工具时,就会降低软件工具的可靠 性。下一章我们将讨论异常结构对程序分析技术的影响。 整三堡! 型! 亘直主箜墨堕 表2 1 研究对象带有衄的 带有c a t c h 程序名称程序描述 程序数目程序数目的程序数目 j a c o r bo r b 执行器 1 0 6 22 7 12 2 9 j a v a c u pl a l r 分析生成器 3 451 7 j d ks u n 公司的j d k l 1 5 1 2 5 63 4 23 7 2 j l e x语法分析产生器 111 s w m gs u n 公式的s w i n g 的 6 9 28 71 0 6 a p l t d b j a v a 调试器 83 ) t o b a j a v a 到c 的转换器 4 31 3 2 7 总计 3 0 9 67 2 27 5 7 】 表2 i 带有异常结构的j a v a 程序调查表 9 第三章异常结构对j a v a 程序分析的影响 在软件维护时,必然会对源程序进行修改。通常对源程序的修改不能无计划 地仓促上阵,为了正确、有效地修改,需要经历三个步骤:分析和理解程序、修 改程序、重新验证程序。 程序理解是一个从计算机中获取信息的过程。这些知识可以用于程序的排 错、增强程序、重用程序以及整理文档等方面的工作上。 程序理解是软件工程领域的一个重要部分。软件工程最为关心的是如何提高 软件开发过程的生产效率和软件产品质量,但是,就目前实际情况来看不容乐观, 大多数软件开发精力花费在维护老系统上,而不是在开发新系统上。估计用于维 护方面的资源和时间占了5 0 一7 5 。 软件维护过程的绝大多数时间用于理解目标系统,活动中涉及读文档、扫描 源代码、理解所作的修改。 经过分析,全面、准确、迅速地理解程序是决定维护成败和质量好坏的关键。 这里,软件的可理解和文档的质量非常重要。因此,必须理解程序的功能和目标; 掌握程序的结构信息,即从程序中细分出若干结构成分,如程序系统结构、控制 结构、数据结构和输入输出结构等;了解数据流信息,即所涉及到数据来源何处, 在哪里被使用:了解控制流信息,即执行每条路径的结果。 前面己经介绍,为了解决错误处理问题得到健壮的程序,许多程序设计语言 提供了异常处理机制。第二章介绍了目前最流行的j a v a 语言具有代表性的异常 处理机制,该机制包含抛出异常和捕获异常两个方面,抛出一个异常意味着发出 个错误信号,而捕获异常是指得到和处理抛出的错误信号。 j a v a 程序员已经广泛地使用异常处理机制,异常机制不仅减少了程序的代码 量,而且将用于描述具体操作的代码与专门纠正错误的代码分隔开,但是,异常 处理机制与程序中的c o n t i n u e 、g o t o 、e x i t 语句类似,可能改变过程内部或过程 之间的控制流,如果分析程序时不考虑异常结构,得到的信息将是不准确的信息, 当把这些信息用在结构测试、回归测试、静态程序切片、动态程序切片、程序理 解等软件工程任务时,可能导致严重的后果。本章基于j a v a 分析了异常结构对控 制流、数据流、控制依赖这些静态程序分析技术的影响。 篁三童 墨堂堕塑型! 型! 堂堑盟星堕一 静态程序分析不需要执行所测试的程序,它扫描所测试程序的正文,对程序 的数据流和控制流进行分析,然后送出测试报告。 3 1 异常结构对控制流分析的影响 控制流图是描述程序控制流的一种图示方法。从控制的角度刻画系统中控制 的转移路径,它以控制状态为描述主体,反映系统在特定数据驱动下的状态。许 多程序分析技术( 数据流分析、控制依赖分析) 和软件工程任务( 结构测试、回 归测试) 都使用控制流图的信息。语句层次上的控制流图表示程序所有可能的执 行路径,控制流图中的结点表示程序语句块,边表示程序语句块之间可能的控制 转移。为了得到准确的控制流信息需要把把异常结构引入到了语句层次的控制流 图中,即在分析程序的控制流时考虑执行t r y 语句的所有路径,它在过程内的控 制流图中增加了下面的路径 5 】【6 】a f 1 ) t r y 块正常完成但f i n a l l y 块抛出了异常,异常沿调用栈传播。 ( 2 ) 仃y 块抛出异常但该层没有处理异常或者c a t c h 块又抛出其它异常,异常将 沿调用栈传播。 ( 3 ) 时块抛出异常且该层的c a t c h 块处理了异常。 ( 4 ) 田块抛出异常且相应的c a t c h 块捕捉了异常,但f m a l l y 块又抛出了异常。 按照下面方法i s l 连接所有过程的控制流图,即形成过程间的控制流图。 ( 1 1 连接每个调用结点和被调用方法的控制流图中的入口结点 ( 2 ) 接控制流中的退出结点和调用方法中相应的结点 ( 3 ) 如果一个方法抛出异常,但该异常被调用方法捕捉,连接异常退出结点 与调用方法中相应的c a t c h 结点 异常处理机制在过程间的控制流图中增加了下面的路径。 ( 1 ) 被调用方法传播了异常但调用方法捕捉了异常 ( 2 ) 被调用方法传播了异常但调用方法中没有处理异常 3 2 异常结构对数据流分析的影响 根据数据流分析的观点,系统模型的功能是数据变换,将软件系统抽象为一 系列的加工单元,各单元之间通过数据流发生关联,加工单元接受输入数据流, 茎三皇 墨堂堕塑翌! 型曼堡壁坌堑堕墨堕一 并把它变换成输出数据流。数据流分析就是收集程序中使用数据、定义数据和数 据依赖等信息的过程。 目前,有两种基本方法分析带有异常结构的数据流,一种方法是在数据流中 增加异常结构的数据流【5 】,另种方法是把异常结构的数据流单独表示出来 1 2 】。本章重点讨论异常结构对数据流分析的影响,进行数据流分析时,采用控 制流图表示程序信息,并在原数据流图中增加异常结构的数据流。数据流分析主 要包括下面几方面:1 、到达定值,变量a 的定值是一个语句,它赋值或可能赋 值给a ,最普通的定值是对a 的赋值或读值到a 的语句,该语句的位置称作a 的定值点。所谓a 的定值点d 到达某点p ,是指如果有路径从紧跟d 的点到达p , 并且在这条路径上d 没有被“注销”。2 、活跃变量,对程序中的某变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论