简介
当你的程序不能正常运行的时候, Python 会在控制台打印一段提醒, 告诉你一个错误, 这个错误就是异常.
错误
我在控制台写了一段无效的代码, 将 print() 的括号去掉, 在执行这条语句的时候, 系统提示语法错误, 无效的语句 (我百度翻译的). 这就是错误处理器所作的工作.
再换一种方式写错误:
在程序获取用户输入的时候, 我们使用 CTRL+d 引发了一个 EOFError 错误, 接下来我们尝试去处理这样的错误.
处理异常
使用 try---except 语句来处理异常. 我们通常把容易产生异常的语句放置在 try 块中, 把做异常处理的语句放在 except 块中.
- import sys
- try:
- a = input('Enter something:')
- except(EOFError):
- print('\nWhy did you do an EOF on me ?')
- sys.exit()
- except:
- print('\nSome error/exception occurred.')
- print('Done')
运行结果
我们把所有可能引发错误的语句放在 try 块中, 然后在 except 从句 / 块中处理所有的错误和异常. except 从句可以专门处理单一的错误或异常, 或者一组包括在圆括号内的错误 / 异常. 如果没有给出错误或异常的名称, 它会处理 所有的 错误和异常. 对于每个 try 从句, 至少都有一个相关联的 except 从句.
你还可以让 try..catch 块关联上一个 else 从句. 当没有异常发生的时候, else 从句将被执行.
- import sys
- try:
- a = input('Enter something:')
- except(EOFError):
- print('\nWhy did you do an EOF on me ?')
- sys.exit()
- except:
- print('\nSome error/exception occurred.')
- else:
- print('no error')
- print('Done')
运行结果
raise 引发异常
你可以使用 raise 语句抛出异常. 你需要指明错误 / 异常的名称和伴随异常触发的异常对象. 这个异常应该是 Error 和 Exception 类的子类. 这就用到了继承的思想, 使用__init__方法初始一些方法和参数.
- class ShortInputException(Exception):
- def __init__(self,length,atleast):
- Exception.__init__(self)
- self.length = length
- self.atleast = atleast
- try:
- s = input('Enter something-->')
- print(len(s))
- if len(s) < 3:
- raise ShortInputException(len(s),atleast = 3)
- except(EOFError):
- print('\nWhy did you do an EOF on me ?')
- except(ShortInputException) as x:
- print('ShortInputException: The in input was of length %d,\
- was expecting at least %d' % (x.length,x.atleast))
- else:
- print('No exception was raised.')
运行结果
try...finally
假如在你读文件的时候发生了异常, 但是无论如何文件都要关闭. 这个时候该怎么做呢?
这里我们需要使用 finally 块来完成.
在使用 try 捕获异常的时候, 我们可以同时使用 except 块和 finally 块.
- import time
- try:
- f = open('poem.txt')
- while True: # our usual file-reading idiom
- line = f.readline()
- if len(line) == 0:
- break
- time.sleep(2)
- print(line)
- finally:
- f.close()
- print('Cleaning up...closed the file')
运行结果
这里使用了 time 的 sleep 函数, 里面的参数是它的运行间隔.
这样我们就有时间去使用 CTRL+c 使程序发生异常. 这时候我们发现 finally 块中的语句还是运行的, 文件正常关闭了.
来源: https://www.cnblogs.com/liuhappy/p/10668515.html