1. try except
在使用这种异常处理时需要注意,try 中的代码不要过于复杂,因为过多的代码容易导致定位异常变得十分困难。
同时,也不要单独使用一个 except 来捕获,否者错误定位容易出错。原因有,一、异常有很多种类,一个 except 可能捕捉不到;二、在 Python 中各种异常是内建的,具有一定的继承结构,所以父类异常一般要写得靠后,子类异常写得靠前。
通常在循环遍历变量时,如果在 try 语句中出现了异常,我们经常需要忽略异常继续执行 try 中的语句,这时候只需要在 except 后添加 continue 即可。
1 | try: |
2. try finally
try finally 语句有一项常见的用途,就是确保能够关闭文件句柄。比如,在写入文件过程中由于找不到文件而导致 IOError,不管怎么样,finally 中的 file.close()
是一定会执行的。
1 | file = open('file_path', 'w') |
在阅读《编写高质量代码——改善python程序的91个建议》这本书的时候,书中有讲到在使用 try-finally 语句时,在 finally 中有个地方很容易出错。比如,在 finally 中使用 return 进行返回:
1 | def try_finally(a): |
当输入为 -1 时,执行程序会抛出异常并且返回 -1。当输入为 2 的时候,想当然程序应该会返回 2。其实不然,当程序运行到 else 语句之前会先执行 finally 中的 return 语句,所以没等到先执行 else 语句,程序就提前结束了。
1 | try: |
3. raise exception
如果在捕获异常之后要显示重复地抛出,特别是当你觉得系统给出的错误信息不足需要补充,raise 语句能够帮助你做到这一点。
1 | >>> try: |
4. 例子
新打开一个文件 test.txt
,使用 chmod 取消文件的写入权限(chmod -w test.txt
),人为“故意”制造一个错误。
1 | #!/usr/bin/python |