假设编写下面的函数:
>>> def fetcher(obj,index): return obj[index]正常运算中,它将返回合法的索引值的结果:
>>> x = 'spam' >>> fetcher(x,3) 'm'然而,若索引指向字符串末尾以后的位置,就会引发异常。Python会替序列检测到超出边界的索引运算,并通过【抛出】内置的IndexError异常进行报告。
>>> fetcher(x,4) Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> fetcher(x,4) File "<pyshell#2>", line 2, in fetcher return obj[index] IndexError: string index out of range因为我们的代码没有可以捕捉这个异常,所以它将会一直向上返回到程序顶层,并启用【默认的异常处理器】:就是打印标准出错消息。
-----------------------------------------------------------------------------------------------------------------------------------
捕获异常
不过,在有些情况下,这并不是我们想要的。例如,服务器程序一般需要在内部错误发生时依然保持工作。如果不想要默认的异常行为,就需要把调用包装在try语句内,自行捕捉异常。
>>> try: fetcher(x,4) except IndexError: print('got exception') got exception现在,当try代码块执行时触发异常,Python会自动跳至处理器(指出引发的异常名称的except分句下面的代码块)。在实际的程序中,try语句不仅会捕获异常,也会从中恢复执行:
>>> def catcher(): try: fetcher(x,4) except IndexError: print('got exception') print('continuing') >>> catcher() got exception continuing这次,在异常捕捉和处理后,程序在捕捉了整个try语句后继续执行:这就是得到“continuing”消息的原因。我们没有看见标准出错消息,而程序也将正常运行下去。
用户定义的异常
用户定义的异常能够通过类编写,它继承自一个内置的异常类:通常这个类的名称叫做Exception。
>>> class Bad(Exception): pass >>> def doomed(): raise Bad() >>> try: doomed() except Bad: print('Got Bad') Got Bad
============================================================================
>>> try: fetcher(x,3) finally: print('after fetch') 'm' after fetch在这里,如果try代码块完成后没有异常,finally代码块就会执行,而程序会在整个try后继续下去。
>>> with open('test.txt','w') as file: file.write('The night!')