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 #条件为假时,返回异常
反射