文章目录
5.1 异常处理
5.1.1 异常捕获后要加 finally
使用try…except…
结构对代码作保护时,需要在异常后使用finally…
结构保证操作对象的释放
说明:
使用try…except…
结构对代码作保护时,如果代码执行出现了异常,为了能够可靠地关闭操作对象,需要使用finally…
结构确保释放操作对象。
示例:
handle = open(r"/tmp/sample_data.txt") # May raise IOError
try:
data = handle.read() # May raise UnicodeDecodeError
except UnicodeDecodeError as decode_error:
print(decode_error)
finally:
handle.close() # Always run after try:
5.1.2 异常捕获时需注明异常类型
不要使用except:
语句来捕获所有异常
说明:
在异常这方面,Python
非常宽容,except:
语句真的会捕获包括Python
语法错误在内的任何错误。使用except:
很容易隐藏真正的bug
,我们在使用try…except…
结构对代码作保护时,应该明确期望处理的异常。Exception
类是大多数运行时异常的基类,一般也应当避免在except
语句中使用。通常,try
只应当包含必须要在当前位置处理异常
的语句,except
只捕获必须处理的异常。比如对于打开文件的代码,try
应当只包含open
语句,except
只捕获FileNotFoundError
异常。对于其他预料外的异常,则让上层函数捕获,或者透传到程序外部来充分暴露问题。
# 错误示例:
# 如下代码可能抛出两种异常,使用"except:"语句进行统一处理时,如果是open执行异常,将在"except:"语句之后handle无效的情况下调用close,报错handle未定义。
try:
handle = open(r"/tmp/sample_data.txt") # May raise IOError
data = handle.read() # May raise UnicodeDecodeError
except:
handle.close()
# 正确示例:
try:
handle = open(r"/tmp/sample_data.txt") # May raise IOError
try:
data = handle.read() # May raise UnicodeDecodeError
except UnicodeDecodeError as decode_error:
print(decode_error)
finally:
handle.close()
except (FileNotFoundError, IOError) as file_open_except:
print(file_open_except)
5.1.3 不在except
分支里面的raise
都必须带异常
说明:raise
关键字单独使用只能出现在try-except
语句中,重新抛出except
抓住的异常。
# 错误示例:
>>> a = 1
>>> if a==1:
... raise
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError