Python中是否有某种方法可以捕获KeyboardInterrupt事件而不将所有代码放在try- except语句中?
如果用户按Ctrl+,我想干净利落地退出C.
是否有一种优雅的方法来处理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街区?
文档的java.lang.Error说:
Error是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题
但是作为java.lang.Error子类java.lang.Throwable,我可以捕获这种类型的Throwable.
我明白为什么抓住这种例外不是一个好主意.据我所知,如果我们决定捕获它,catch处理程序不应该自己分配任何内存.否则OutOfMemoryError将再次抛出.
所以,我的问题是:
java.lang.OutOfMemoryError可能是一个好主意?java.lang.OutOfMemoryError,我们怎么能确定catch处理程序本身不分配任何内存(任何工具或最佳实践)?我有以下代码:
try {
phpDoc(vscode.window.activeTextEditor);
} catch (err) {
console.error(err);
vscode.window.showErrorMessage(err.message);
}
Run Code Online (Sandbox Code Playgroud)
但是在 上err.message出现错误,但我无法在 中键入对象。Object is of type 'unknown'.ts(2571)err.catch (err: Error)
我应该怎么办?
所以,我知道try/catch会增加一些开销,因此不是控制流程流的好方法,但是这种开销来自何处以及它的实际影响是什么?
这是将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"中受益.
从.NET 3.5/C#应用程序,我想抓住,SqlException但只有它是由 SQL Server 2008实例上的死锁引起的.
典型的错误消息是 Transaction (Process ID 58) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
但是,对于此异常,它似乎不是一个记录错误代码.
针对其消息中存在死锁关键字而过滤异常似乎是实现此行为的一种非常难看的方式.有人知道这样做的正确方法吗?
有什么区别
try {
fooBar();
} finally {
barFoo();
}
Run Code Online (Sandbox Code Playgroud)
和
try {
fooBar();
} catch(Throwable throwable) {
barFoo(throwable); // Does something with throwable, logs it, or handles it.
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢第二个版本,因为它让我可以访问Throwable.两种变体之间是否有任何逻辑差异或首选约定?
另外,有没有办法从finally子句访问异常?
请考虑以下代码:
public Object getClone(Cloneable a) throws TotallyFooException {
if (a == null) {
throw new TotallyFooException();
}
else {
try {
return a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
//cant be reached, in for syntax
return null;
}
Run Code Online (Sandbox Code Playgroud)
这return null;是必要的,因为可能会捕获异常,但是在这种情况下,因为我们已经检查它是否为null(并假设我们知道我们调用的类支持克隆)所以我们知道try语句永远不会失败.
在最后放入额外的return语句只是为了满足语法并避免编译错误(使用注释解释它不会达到)是不好的做法,或者是否有更好的方法来编写这样的东西以便额外的返回声明是不必要的?
try/catch块中的return语句如何工作?
function example() {
try {
return true;
}
finally {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我期待这个功能的输出true,但它是false!
try-catch ×10
java ×4
.net ×2
finally ×2
python ×2
return ×2
try-finally ×2
c# ×1
deadlock ×1
except ×1
exception ×1
javascript ×1
optimization ×1
performance ×1
sqlexception ×1
typescript ×1