我遇到了一个非常奇怪的问题,那让我怀疑我是否理解异常处理。Python 2.7 - 在finally子句上的奇怪行为
我有一个代码(我将在后结束),看起来或多或少是这样的:
try:
doSomething()
finally:
print 'bye'
finally子句中的代码,当我通过CTRL退出我的程序没有被执行+ C。
更糟糕的是,现在考虑以下因素:
try:
doSomething()
except: # this could be replaced by except Exception, it doesn't matter
print 'something'
finally:
print 'bye'
现在不执行除了子句中的代码..但最后子句中的代码!
我意识到这必须是由doSomething()执行的代码的错误。但我的问题是,怎么可能呢?我认为我们可以100%确信最终条款总是被执行。
这里是真正的代码。它运行在覆盆子pi 3上。它是对代码here的改编。
import RPi.GPIO as GPIO, time
GPIO.setmode(GPIO.BCM)
# Define function to measure charge time
def RCtime (PiPin):
# Discharge capacitor
GPIO.setup(PiPin, GPIO.OUT)
GPIO.output(PiPin, GPIO.LOW)
time.sleep(.1)
time1 = time.time()
GPIO.setup(PiPin, GPIO.IN)
if (GPIO.input(PiPin) == GPIO.LOW):
GPIO.wait_for_edge(PiPin, GPIO.RISING, timeout=1000)
time_elap = time.time()-time1
return time_elap*1e3
# Main program loop
try:
while True:
print RCtime(4) # Measure timing using GPIO4
except Exception:
print '---------got ya-----------------'
finally:
print '---Finaly---'
GPIO.cleanup() # this ensures a clean exit
更具体地,所描述的行为,当该程序是在GPIO.wait_for_edge(PiPin, GPIO.RISING, timeout=1000)
在线等待出现。
除非尝试失败才会执行。只要程序仍在运行,如果尝试完成或失败,最终将完成。 Crtl-c与sys.exit()相同。抛出异常,但程序终止,因为python退出,所以无法处理该异常。 – TheLazyScripter
@ TheLazyScripter Ctrl-C产生[**'KeyboardInterrupt' **](https://docs.python.org/2/library/exceptions.html#exceptions.KeyboardInterrupt),它可以在异常块中捕获(但不能'Exception Exception'由'KeyboardInterrupt'继承自''BaseException''](https://docs.python.org/2/library/exceptions.html#exceptions.BaseException)而不是'Exception' –
不管我是否捕捉到异常,关键是程序正在终止,并且finally块没有被执行(在第一种情况下),我在问怎么这甚至是可能的, – LGenzelis