异常处理
出现异常也可以继续执行
try:
s = input('Enter something --> ') # Python 2 的输入是 raw_input()
except EOFError as e: 捕获EOFError异常,e代表异常的详细信息
print('\nWhy did you do an EOF on me?')
except: 捕获所有异常
print('\nWhy did you do an Exception on me?')
else: 没有捕捉到异常时执行
print('No exception was raised.')
finally: # 不管是否有异常,最后都会执行
print('finally .....')
常见异常(可避免的):
使用不存在的字典关键字 将引发 KeyError 异常。
搜索列表中不存在的值 将引发 ValueError 异常。
调用不存在的方法 将引发 AttributeError 异常。
引用不存在的变量 将引发 NameError 异常。
未强制转换就混用数据类型 将引发 TypeError 异常。
导入一个并不存在的模块将引发一个 ImportError 异常。
raise 语句
可以使用 raise 语句引发异常(抛出异常)。你还得指明错误/异常的名称和伴随异常触发的异常对象。
可以引发 Error 或 Exception 类的直接或间接导出类。
在Python 3里,抛出自定义异常的语法有细微的变化。
Python 2 Python 3
① raise MyException MyException
② raise MyException, 'error message' raise MyException('error message')
③ raise MyException, 'error message', a_traceback raise MyException('error message').with_traceback(a_traceback)
④ raise 'error message' unsupported(不支持)
说明:
① 抛出不带自定义错误信息的异常,这种最简单的形式下,语法没有改变。
② 抛出带自定义错误信息的异常时:Python 2用一个逗号来分隔异常类和错误信息;Python 3把错误信息作为参数传递给异常类。
③ 抛出一个带用户自定义回溯(stack trace,堆栈追踪)的异常。在Python 2和3里这语法完全不同。
④ 在Python 2里,可以仅仅抛出一个异常信息。在Python 3里,这种形式不再被支持。2to3将会警告你它不能自动修复这种语法。
例:
raise RuntimeError("有异常发生") #抛出异常后脚本退出执行