我不知道为什么我们最终需要尝试……最后陈述。在我看来,这个代码块
try:
run_code1()
except TypeError:
run_code2()
other_code()
和这个finally的用法一样:
try:
run_code1()
except TypeError:
run_code2()
finally:
other_code()
我遗漏了什么吗?
我不知道为什么我们最终需要尝试……最后陈述。在我看来,这个代码块
try:
run_code1()
except TypeError:
run_code2()
other_code()
和这个finally的用法一样:
try:
run_code1()
except TypeError:
run_code2()
finally:
other_code()
我遗漏了什么吗?
当前回答
为了补充上面的其他答案,无论发生什么,finally子句都会执行,而else子句只在没有引发异常时执行。
例如,写入一个没有异常的文件将输出以下内容:
file = open('test.txt', 'w')
try:
file.write("Testing.")
print("Writing to file.")
except IOError:
print("Could not write to file.")
else:
print("Write successful.")
finally:
file.close()
print("File closed.")
输出:
Writing to file.
Write successful.
File closed.
如果存在异常,代码将输出以下内容(注意,故意使文件保持只读会导致错误。
file = open('test.txt', 'r')
try:
file.write("Testing.")
print("Writing to file.")
except IOError:
print("Could not write to file.")
else:
print("Write successful.")
finally:
file.close()
print("File closed.")
输出:
Could not write to file.
File closed.
我们可以看到,无论异常如何,finally子句都会执行。希望这能有所帮助。
其他回答
下面是一段代码来澄清两者的区别:
...
try:
a/b
print('In try block')
except TypeError:
print('In except block')
finally:
print('In finally block')
print('Outside')
A b = 0,1
输出:
In try block
In finally block
Outside
(没有错误,除了跳过块。)
A b = 1,0
输出:
In finally block
Traceback (most recent call last):
a/b
ZeroDivisionError: division by zero
(没有为ZeroDivisionError指定异常处理,只执行finally块。)
A, b = 0, '1'
输出:
In except block
In finally block
Outside
(异常被正确处理,程序没有中断。)
注意:如果你有一个except块来处理所有类型的错误,finally块将是多余的。
运行这些Python3代码来查看finally的需求:
CASE1:
count = 0
while True:
count += 1
if count > 3:
break
else:
try:
x = int(input("Enter your lock number here: "))
if x == 586:
print("Your lock has unlocked :)")
break
else:
print("Try again!!")
continue
except:
print("Invalid entry!!")
finally:
print("Your Attempts: {}".format(count))
例2:
count = 0
while True:
count += 1
if count > 3:
break
else:
try:
x = int(input("Enter your lock number here: "))
if x == 586:
print("Your lock has unlocked :)")
break
else:
print("Try again!!")
continue
except:
print("Invalid entry!!")
print("Your Attempts: {}".format(count))
每次尝试以下输入:
随机整数 正确的代码是586(试试这个,你会得到你的答案) 随机字符串
**在学习Python的早期阶段。
试着先运行这段代码,不要使用finally块,
1 / 0导致除零误差。
try:
1 / 0
print(1)
except Exception as e:
1 / 0
print(e)
然后尝试运行这段代码,
try:
1 / 0
print(1)
except Exception as e:
1 / 0
print(e)
finally:
print('finally')
对于第一种情况,你没有finally块, 因此,当在except块中发生错误时,程序执行将停止,并且在except块之后不能执行任何东西。
但对于第二种情况, 错误发生,但在程序停止之前,python先执行finally块,然后导致程序停止。 这就是为什么你要用finally来做真正重要的事情。
为了补充上面的其他答案,无论发生什么,finally子句都会执行,而else子句只在没有引发异常时执行。
例如,写入一个没有异常的文件将输出以下内容:
file = open('test.txt', 'w')
try:
file.write("Testing.")
print("Writing to file.")
except IOError:
print("Could not write to file.")
else:
print("Write successful.")
finally:
file.close()
print("File closed.")
输出:
Writing to file.
Write successful.
File closed.
如果存在异常,代码将输出以下内容(注意,故意使文件保持只读会导致错误。
file = open('test.txt', 'r')
try:
file.write("Testing.")
print("Writing to file.")
except IOError:
print("Could not write to file.")
else:
print("Write successful.")
finally:
file.close()
print("File closed.")
输出:
Could not write to file.
File closed.
我们可以看到,无论异常如何,finally子句都会执行。希望这能有所帮助。
为了让Abhijit Sahu对这个答案的评论更好看,并突出显示语法:
像这样,你可以观察到在以下情况下哪个代码块发生了什么:
try:
x = Hello + 20
x = 10 + 20
except:
print 'I am in except block'
x = 20 + 30
else:
print 'I am in else block'
x += 1
finally:
print 'Finally x = %s' %(x)