python - 在一个try语句中不能同时使用except和finally子句?
PHP中文网
PHP中文网 2017-04-17 11:35:14
0
3
1993
try:
    1/0
except:
    print 'something wrong happened..'
finally:
    print 'it seems i cannot be with except'

除非是我对《python基础教程》上面这句话理解有问题,这段代码运行完全没有问题,求解惑。

PHP中文网
PHP中文网

认证0级讲师

Antworte allen(3)
阿神

可以肯定的回答能一起使用

先看下else的使用:

try:
    ...
exception:
    ...
else:
    ...

只有在try中没有发生任何异常,所有代码完全成功的情况下才会转入else

再看下finally:

finally是无论是否捕捉到异常都会执行的一句,finally 可以单独和try搭配,也可以和except,包括else一起配合使用

try: A
except MyException: B
else: C
finally: D

执行顺序可能为A-B-D或A-C-D finally 单独和try连用时,不是用来捕捉异常,常常是用来维持一致的行为。

当try范围中产生一个异常时,会立即跳转到finally,finally执行完毕后,会继续向上一层引发异常

  • 一个这样写的理由是如果在 finally 的语句块内发生了一个异常,你可以创建一个同现有的异常 处理器在同一个(外)层次的异常处理器来处理它.这样,从本质上来说,就可以同时处理在原始的 try 语句块和 finally 语句块中发生的错误.这种方法唯一的问题是,当 finally 语句块中的确发生异常 时,你会丢失原来异常的上下文信息,除非你在某个地方保存了它.
  • 反对这种写法的一个理由是:在很多情况下,异常处理器需要做一些扫尾工作,而如果你在异常 处理之前,用 finally 语句块中释放了某些资源,你就不能再去做这项工作了.简单的说,finally 语句 块并不是如你所想的是"最终的(final)"了.

  • 一个最终的注意点:如果 finally 中的代码引发了另一个异常或由于 return,break,continue 语 法而终止,原来的异常将丢失而且无法重新引发.

参考:python 核心编程

阿神

这本书对应的python版本太老了。py2.4以前是不能一起用的,2.5+就可以了。

这种老的不更新的书跟《pE INTO PYTHON》一样,能不看就别看了,入门推荐《a byte of python》。

Peter_Zhu

简单理解就是无论try里的语句是否发生异常,最后都会去执行一遍finaly里面的内容。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage