Python面向对象 杂篇(后记)

异常处理

什么是异常:
        我们在调试程序时,常常会因为各种报错信息导致程序无法运行,异常也是一个对象,用来表示错误。我们可以捕捉异常,并做相应处理,从而增加代码的友好程度。
异常处理:
        捕捉异常可以使用try/except语句。当代码运行过程中遇到try语句时,会先执行其中的代码,如果正常执行,则跳过except语句继续向下执行;如果触发异常,则执行except语句,由except语句进行异常处理。
try:
    pass
except Exception:
    pass
异常的种类:
python中的异常非常多,每种异常都可以找到专门的异常来处理。这里仅列举一些常见异常
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError 语法错误
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
RuntimeError 一般的运行时错误

当我们指定异常的种类时,则只能处理相应的异常,其他种类的异常捕获不到

dir = {'k1':'v1','k2':'v2'}
try:    
    a = dir['k3']
    print(a)
except KeyError:   #捕捉到相应异常
    print('no such key')
>>>
no such key
a='zhang'
try:
    int(a)
except TypeError: #指定的异常种类不正确,无法捕捉异常
    print('error')
>>>
Traceback (most recent call last):
  File "C:/Users/issuser/PycharmProjects/Python/day9/socket client.py", line 11, in <module>
    int(a)
ValueError: invalid literal for int() with base 10: 'zhang'
写程序时,有时候要考虑处理多个异常,可以写多个except,不过要注意匹配的异常范围一个是从小到大,以免无法捕获相应的异常。
  万能异常:python中还有一个异常可以捕获所有的异常,它就是Exception,可以捕获所有的异常。
a = 'zhang'
try:
    int(a)
except TypeError:
    print('type error')
except Exception:   #可以捕获所有异常,保证程序运行
    print('other error')

 在异常中,我们还可以使用else,如果没有触发异常,则继续执行else代码。如果触发异常,则处理异常,不再执行else。

try:
    # 主代码块
    pass
except KeyError,e:
    # 异常时,执行该块
    pass
else:
    # 主代码块执行完,执行该块
    pass
finally:
    # 无论异常与否,最终执行该块
    pass

 try/finally形式,当执行完try块后,无论是否出发异常,都执行finally块。

try:
    # 主代码块
    pass
except KeyError:
    # 异常时,执行该块
    pass
else:
    # 主代码块执行完,执行该块
    pass
finally:
    # 无论异常与否,最终执行该块
    pass

 除了捕获代码异常外,还可以主动触发异常(实在想不起有什么鸟用)

try:
    raise IndexError('error')  #raise主动触发异常,注明异常的种类
except TypeError:
    print('type error')
except IndexError:            #相应的异常捕获主动触发的异常
    print('index error')
>>>
index error

 断言:

# assert 条件
 
assert 1 == 1    #条件为真时,返回空值
 
assert 1 == 2    #条件为假时,返回异常

 

反射

 

posted @ 2016-07-02 11:36  张瑞东  阅读(229)  评论(0编辑  收藏  举报