1.else的用法

对try...except的补充:

else子句的使用比在子句中添加其他代码更好,try因为它避免了意外捕获由try... except语句保护的代码未引发的异常。

for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except OSError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()

2.finally用法

try语句有一个可选finally子句,用于定义在所有情况下都必须执行的finally操作

try:
raise KeyboardInterrupt
finally:
print('Goodbye, world!') Goodbye, world!
KeyboardInterrupt
Traceback (most recent call last):
File "<stdin>", line 2, in <module>

如果存在finally子句,则该finally子句将作为try语句完成之前的最后一项任务执行。finally无论该try语句是否产生异常,该子句都会运行。

以下几点讨论了发生异常时更复杂的情况:

  • 如果在执行该try子句期间发生异常,则该异常可以由except子句处理。如果该异常未由except子句处理,finally则在执行该子句后将重新引发该异常。

  • 执行exceptor else子句期间可能会发生异常。同样,在finally执行该子句之后,将重新引发异常。

  • 如果try语句到达breakcontinuereturn语句时,finally条款将在<try or else or except的>breakcontinuereturn语句之前执行。

  • 如果finally子句包含一条return语句,则该finally子句的return语句将在<try or else or except的>子句中的return语句之前执行,所以事实上执行了的是finally的return,而不是在<try or else or except>中执行return语句。

案例1.

>>> def bool_return():
... try:
... return True
... finally:
... return False
...
>>> bool_return()
False

案例2.

def bool_return():
try:
raise Exception
except Exception:
return True
finally:
return False print(bool_return())
False

案例3.

>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print("division by zero!")
... else:
... print("result is", result)
... finally:
... print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("", "")
executing finally clause
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'

最新文章

  1. PHP常用函数整理
  2. BZOJ2432 [Noi2011]兔农
  3. 最小集合(51nod 1616)
  4. ACM: SGU 101 Domino- 欧拉回路-并查集
  5. TFS 2010 如何删除Collection
  6. BZOJ1816 [Cqoi2010]扑克牌
  7. ASP.NET 最佳DataGrid读取单元格的值
  8. 【JS对象、JSON字符串】之间的相互转换
  9. Applied Functional Analysis(Applications to Mathematical Physics ) E.Zeidler
  10. poj1436 Horizontally Visible Segments
  11. C语言volatile关键字
  12. java web部署问题
  13. HTTP Basic Authentication认证的各种语言 后台用的
  14. getScrollX()理解
  15. git 创建分支,删除分支,管理分支
  16. junit--eclipse插件
  17. [HNOI2009]无归岛
  18. 【解决】nginx 下$_SERVER[&#39;PATH_INFO&#39;] 无法获取到内容
  19. drawImg、x5浏览器、react
  20. 仓储层接口IBaseRepository解析

热门文章

  1. IPD术语
  2. Python if __name__ == &#39;__main__&#39;: 理解
  3. 第7章:LeetCode--算法:递归问题
  4. Education Reform(CodeForces-119C)【DP】
  5. Photon Server初识(四) --- 部署自己的服务Photon Server
  6. 11.vim常用操作
  7. Zynq-7000 MiZ701 SOC硬件使用手册
  8. Qt 中配置 c99的问题
  9. 获取impala下所有的数据库建表语句
  10. 阿里十年架构师告诉你Spring Boot与Spring Cloud是什么关系