什么是异常


  Python用 异常对象(exception object)来表示异常情况。遇到错误后,会引发异常,如果异常对象并未被处理或者捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行:

>>> 1/0

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    1/0
ZeroDivisionError: integer division or modulo by zero

  每个异常都是一些类的实例,这些实例可以被引发,并且可以用很多种方法进行捕捉,是的程序可以捕捉错误并且对其进行处理,而不是让整个程序失败。

按自己的方式出错


  1. raise 语句
    为了引发异常,可以使用一个类(应该是Exception的子类)或者实例参数调用raise语句。使用类时,程序会自动创建实例,下面是一些例子:

    >>> raise Exception
    
    Traceback (most recent call last):
      File "<pyshell#0>", line 1, in <module>
        raise Exception
    Exception

    下面是一些最重要的内建异常类:

    类名

    描述

    Exception   所有异常的基类  
    AttributeError   特性引用或者赋值失败时引发
    IOError   试图打开不存在的文件(包括其他情况)时引发
    IndexError 在使用序列中不存在的索引时引发
    KeyError 在使用映射中不存在的键时引发
    NameError 在找不到名字(变量)时引发
    SyntaxError 在代码为错误形式时引发
    TypeError 在内建操作或者函数应用于错误类型的对象时引发
    ValueError 在内建操作或者函数应用于正确类型的对象,但是该对象使用不合适的值时引发    
    ZeroDivisionError     在除法或者模除操作的第二个参数为0的时候引发
  2. 自定义异常类
    确保从Exception类继承:
    >>> class SomeCustomException(Exception):pass
  3. 捕捉异常
    先举例:
    try:
        x = input('Enter the first number:')
        y = input('Enter the second number:')
        print x/y
    except ZeroDivisionError:
        print "The second number can't be zero!"

    运行结果:

    >>>
    Enter the first number:3
    Enter the second number:0
    The second number can't be zero!
  4. 不止一个except子句
    try:
        x = input('Enter the first number:')
        y = input('Enter the second number:')
        print x/y
    except ZeroDivisionError:
        print "The second number can't be zero!"
    except TypeError:
        print "That wasn't a number , was it?"

    运行结果:

    Enter the first number:2
    Enter the second number:"python"
    That wasn't a number , was it?

    只要在try/except后面追加一个except语句

  5. 用一个块捕捉两个异常
    try:
        x = input('Enter the first number:')
        y = input('Enter the second number:')
        print x/y
    except (ZeroDivisionError,TypeError,NameError):
        print "Your number were bogus..."
  6. 捕捉对象
    先举例运行:
    try:
        x = input("Enter the first number:")
        y = input("Enter the second number:")
        print x/y
    except(ZeroDivisionError,TypeError),e:
        print e

    运行结果:

    Enter the first number:3
    Enter the second number:0
    integer division or modulo by zero

    如果希望在except子句中访问异常对象本身,可以使用两个参数。比如,如果想让程序继续运行,但是又因为某种原因想记录下错误,这个功能就很实用。

  7. 万事大吉
    对try/except加入else语句
    示例:
    while True:
        try:
            x = input("Enter the First number: ")
            y = input("Enter the Second number: ")
            value = x/y
            print "x/y is ", value
        except Exception,e:
            print 'Invalid input:',e
            print 'PLS try again!'
        else:
            break

    运行结果:

    Enter the First number: w
    Invalid input: name 'w' is not defined
    PLS try again!
    Enter the First number: 1
    Enter the Second number: 0
    Invalid input: integer division or modulo by zero
    PLS try again!
    Enter the First number: 5
    Enter the Second number: 4
    x/y is  1

异常和函数


  异常和函数能很自然地一起工作,如果异常在函数内引发而不被处理,它就会传播至函数调用的地方。如果在哪里也没有处理异常,它就会继续传播,一直到达主程序(全局作用域)。如果哪里没有异常处理程序,程序会带着堆栈跟踪中止。

《Python基础教程(第二版)》学习笔记 -> 第八章 异常的更多相关文章

  1. Jquery基础教程第二版学习记录

    本文仅为个人jquery基础的学习,简单的记录以备忘. 在线手册:http://www.php100.com/manual/jquery/第一章:jquery入门基础jquery知识:jquery能做 ...

  2. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第10章 | 充电时刻

    第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简 ...

  3. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第04章 | 字典

    第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中.键能够使字符.数字.或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每一个键都是由坐标值组 ...

  4. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第12章 | 图形用户界面

    Python支持的工具包非常多.但没有一个被觉得标准的工具包.用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ ...

  5. 第二章、元组和列表(python基础教程第二版 )

    最基本的数据结构是序列,序列中每个元素被分配一个序号-元素的位置,也称索引.第一个索引为0,最后一个元素索引为-1. python中包含6种内建的序列:元组.列表.字符串.unicode字符串.buf ...

  6. python基础教程第二版 第一章

    1.模块导入python以增强其功能的扩展:三种方式实现 (1). >>> Import math >>> math.floor(32.9) 32.0 #按照 模块 ...

  7. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第11章 | 文件和素材

    打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text ...

  8. Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver

    1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...

  9. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

  10. python cookbook第三版学习笔记十:类和对象(一)

    类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair:     def __init__(self,x,y):         self.x=x         self. ...

随机推荐

  1. eclipse导入maven web 项目 但是不显示成web 项目

    http://blog.csdn.net/jun55xiu/article/details/9028403 1:导入Maven webapp项目(以extdirectspring-demo为例): i ...

  2. java使用Apache POI操作excel文件

    官方介绍 HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format. XSSF is ...

  3. 【mongoDB基础篇①】安装与常用操作语句

    简述 mongoDB与redis同为noSql数据库,但是redis为kv数据库(key/value),而mongoDB为文档型数据库存储的是文档(Bson->json的二进制化).内部执行引擎 ...

  4. WCF入门(十二)---WCF异常处理

    WCF服务开发者可能会遇到需要以适当的方式向客户端报告一些不可预见的错误.这样的错误,称为异常,通常是通过使用try/catch块来处理,但同样,这是非常具体的技术. 由于客户端的关注领域不是关于如何 ...

  5. eclipse(STS,myeclipse)老是报ThreadPoolExecutor$Worker.run()

    资料地址:http://stackoverflow.com/questions/6290470/eclipse-debugger-always-blocks-on-threadpoolexecutor ...

  6. PHP的线程安全与非线程安全版本的区别

    Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...

  7. 安卓开发44:解决 INSTALL_FAILED_UID_CHANGED 等问题

    apk无法卸载,一般可以下面的方法试一下: 1. 删除/data/app/(filename) 文件夹下的apk包 2. 删除/system/app/(filename) 文件夹下的apk包 3. 将 ...

  8. 《数据通信与网络》笔记--TCP中的拥塞控制

    1.拥塞窗口 发送方窗口的大小不仅取决于接收方,而.而且还取决于网络拥塞的情况. 发送方有2种信息:接收方通告的窗口大小和拥塞窗口的大小,实际的窗口大小事这两者中的最小者. 实际窗口大小 = min( ...

  9. iosUITextField属性

    @property UITextField *caption; caption = [[UITextField alloc] initWithFrame:CGRectMake(, self.frame ...

  10. ExtJs自学教程(1):一切从API开始

    题 记 该系列文章不侧重全方位的去介绍ExtJs的使用,只是侧重于解决ExtJs问题的思考方法.写的人不用长篇大论,学的人则能够自立更生.l  学习的人只要有一些CSS的javascript的基础知识 ...