zoukankan      html  css  js  c++  java
  • 异常处理机制

           大多数的计算机硬件系统,具有检测某些运行时错误情况的能力,例如浮点数上溢。在许多早期的程序设计语言所使用的设计和实现的方式,使得用户程序既不能发现也不能处理这样的错误。在这些早期语言中,发生一种错误仅仅是引起程序终止,并且将控制转移到操作系统。操作系统对于运行时错误的典型反应,是显示一条诊断信息;这条信息可能含义清楚而有用,或者是十分模糊地。在显示了出错信息后,系统就将此程序终止。

           许多当代语言的设计人员,已经在语言中包括了某些机制,能够使程序按照一种标准的方式,对于某些运行时错误和其他程序所检测到的异常事件做出反应。当硬件或系统软件检查出某种事件的发生时,还能够通知程序以便能够做出必要地反应。所有这些机制都被统称为异常处理。

            我们将硬件能够发现的错误,如读盘错误,以及硬件能够发现的非寻常情况,入文件结尾,都认为是异常。再进一步,我们将异常的概念拓展到包括任何可以由软件发现的错误或任何非寻常的情况。因此,我们将异常定义为:不论存在错误与否,任何可能由硬件或软件发现的并需要特殊处理的非寻常事件。

            异常检测所要求的特殊处理被称为异常处理。通过一种被称为异常处理程序的代码单位,来进行这种处理。当发生与异常相关的事件时,异常提出的异常处理程序,通常根据异常类型的不同而不同。当检测进行到文件的结尾时,几乎总是需要这种程序作出某种特殊的行为。但显然,这种行为不属于数组下标范围错误的异常。有的时候,异常处理程序做出的惟一行动,可能就是产生出错信息以及命令程序终止。

            在有些情形下,程序人员可能希望暂时忽略某种由硬件检测出来的异常。例如,被零除的情况。这可以通过禁用异常处理来达到。被禁用的异常处理设施可以在稍后再启用。

            即使在语言中没有专用的异常处理设施,也可以处理由用户所定义的、并且软件可以检测的异常。如果在一个程序单位里发现了这种异常,通常是由这个单位的调用程序来处理。一种可能的设计师,发送一个额外的参数来作为状态变量。被调用的单位根据计算的正确性和正常性给状态变量赋值。当状态变量从被调用的单位返回时,调用程序立刻测试这个变量。如果状态变量值指示发生了异常,可能是位于调用单位中的异常处理程序就行动起来。许多C语言的库函数使用这种方式的一种变体:返回值被用来作为出错指示器。

            另外一种可能的方案是传递一个标号参数给子程序。当然,这只能是在允许将标号作为参数使用的语言中。如果异常发生,传递的标号允许被调用单位返回到调用程序中不同的地点。与第一种方案一样,异常处理程序通常是调用单位代码中得一段。这是Fortran中标号参数的一种常见用法。

            第三种可能的方案是将一个异常处理程序写成单独的子程序,并且可以将这个子程序作为参数传递给被调用的单位。在这种情况下,异常处理子程序由调用程序提供。当异常出现时,被调用单位直接调用异常处理子程序。这种方法中的问题是,不论需要与否,每一次的子程序调用,都必须发送异常处理子程序。此外,为了要处理一些不同类型的异常,还必须传递几个异常处理子程序,从而增加了代码的复杂性。

            异常与异常处理程序的绑定,当提出异常的程序块或程序单位包含了一个异常处理程序时,异常与处理程序的绑定为静态的。如果当提出异常的程序块或程序单位,没有包含处理这种异常的处理程序时,这个异常就被传播到某个其他的块或单位中去。异常的传播方式取决于出现的程序实体。

            当异常在过程中被提出时,不论是在声明语句确立时,还是在程序体执行时,如果这个过程没有处理这种异常的处理程序,异常就被隐式地在调用的位置传播到调用程序单位去。这种策略反反映了一种设计思想,即异常传播应该是经由控制途径的回朔,而不是 经静态祖先。

            如果异常所传播的调用单位也没有这种异常的处理程序,就再一次将这个异常传播到这个单位的调用单位。如果必要地话,这种过程将一直继续到主程序。如果异常被传播到主程序,而在主程序也找不到相应的处理程序,程序就被终止。

            java中的异常处理机制:

       有过一些经验的开发人员都能体会到,在开发项目的过程中,核心业务代码只占了20%~30%左右的时间,而用于开发容错代码的时间却高于70%~80%,这大大降低了开发效率。Java中提供的异常处理机制,可以很好地在一定程度上解决这个问题。

        Java中的异常处理机制,就是把通常的错误处理封装了,当有异常发生时,由系统进行接管,我们只要负责向上抛就可以(系统以有的异常)。

          我们先来看看java中异常的类库

     

    异常处理的语法

    Try{

    }catch(){

    }

    Finally{

    }

    catchfinally必须紧跟try

    Catchfinally不能同时省略

    Trycatchfinally必须紧跟try

    参考资料:《程序设计语言原理》  《Java SE 6.0编程指南》

  • 相关阅读:
    安卓学习26(ListView的焦点问题)
    ACL Contest1 B- Sum is Multiple 数论,EXGCD
    P4137 Rmq Problem / mex 可持久化线段树求区间MEX
    [可持久化权值线段树] [模板] [数组版本]
    CodeForces383C Propagating tree 思维 线段树 DFS序
    CodeForces 558E A Simple Task 线段树 桶排思想
    P1471 方差 线段树维护区间方差
    Leetcode1521 找到最接近目标的函数值 位运算
    CodeForces-739C Alyona and towers 线段树经典套路之维护左中右
    GYM-101194F Mr. Panda and Fantastic Beasts 后缀数组套路
  • 原文地址:https://www.cnblogs.com/jasonteststudy/p/2125818.html
Copyright © 2011-2022 走看看