我正在审查一些新代码.该程序只有一个try和一个finally块.由于catch块被排除在外,如果遇到异常或任何可抛出的东西,try块如何工作?它只是直接进入finally块吗?
对于Python中任何可能的try-finally块,是否可以保证finally块总是被执行?
例如,假设我在一个except块中返回:
try:
1/0
except ZeroDivisionError:
return
finally:
print("Does this code run?")
Run Code Online (Sandbox Code Playgroud)
或许我重新提出一个Exception:
try:
1/0
except ZeroDivisionError:
raise
finally:
print("What about this code?")
Run Code Online (Sandbox Code Playgroud)
测试显示finally上面的例子确实执行了,但我想还有其他我没有想过的场景.
是否有任何情况下finally块无法在Python中执行?
是否有一种优雅的方法来处理finally块中抛出的异常?
例如:
try {
// Use the resource.
}
catch( Exception ex ) {
// Problem with the resource.
}
finally {
try{
resource.close();
}
catch( Exception ex ) {
// Could not close the resource?
}
}
Run Code Online (Sandbox Code Playgroud)
你如何避免try/ catch在finally街区?
这是将python"with"语句与try-except块结合使用的正确方法吗?:
try:
with open("file", "r") as f:
line = f.readline()
except IOError:
<whatever>
Run Code Online (Sandbox Code Playgroud)
如果是,那么考虑旧的做事方式:
try:
f = open("file", "r")
line = f.readline()
except IOError:
<whatever>
finally:
f.close()
Run Code Online (Sandbox Code Playgroud)
这里"with"语句的主要好处是我们可以摆脱三行代码吗?对于这个用例来说,这似乎并不令我感到高兴(尽管我理解"with"语句还有其他用途).
编辑:上面两个代码块的功能是否相同?
EDIT2:前几个答案一般性地讨论了使用"with"的好处,但这些似乎在边缘效益.我们已经(或应该已经)多年来明确地调用f.close().我想一个好处是,草率编码器将从使用"with"中受益.
在我的Angular.js应用程序中,我正在运行一些异步操作.在它开始之前我用模态div覆盖应用程序,然后一旦操作完成,我需要删除div,无论操作是否成功.
目前我有这个:
LoadingOverlay.start();
Auth.initialize().then(function() {
LoadingOverlay.stop();
}, function() {
LoadingOverlay.stop(); // Code needs to be duplicated here
})
Run Code Online (Sandbox Code Playgroud)
它运作良好,但我更喜欢像这个伪代码一样更清洁:
LoadingOverlay.start();
Auth.initialize().finally(function() { // *pseudo-code* - some function that is always executed on both failure and success.
LoadingOverlay.stop();
})
Run Code Online (Sandbox Code Playgroud)
我想这是一个相当普遍的问题,所以我想这是可以做到,但不能找到文档中任何事情.有什么想法可以吗?
据我所知,以下两个代码片段都将起到同样的作用.为什么要有finally块?
代码A:
try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }
Run Code Online (Sandbox Code Playgroud)
代码B:
try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code
Run Code Online (Sandbox Code Playgroud) 在Java中,目的是什么做的关键字final,finally并finalize履行?
我已经使用了多种语言的try-catch/except-finally变种多年,今天有人问我最后的意思是什么,我无法回答.
基本上为什么你会在最后一个语句中放入一个语句,而不是仅仅将它放在整个try-catch块之后?或者换句话说,以下代码块之间存在差异:
try{ //a}
catch {//b}
finally {//c}
try{//a}
catch{//b}
//c
Run Code Online (Sandbox Code Playgroud)
编辑:人
,我知道最后做了什么,我已经使用了很长时间,但我的问题是在上面的例子中放入//c最后似乎多余,不是吗?