问题标签 [try-finally]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
903 浏览

multithreading - Delphi 线程超时导致泄漏

所以,我已经使用 THandle 实现了线程,就像这样:

当线程正常时(没有达到超时并且进程没有提前结束)没有任何泄漏,但是如果线程有问题并达到超时,它会给我很多泄漏,因为,我猜猜,它只是离开了函数,忽略了所有的尝试......最后我释放了所有东西。

有没有办法完成线程,并杀死它允许的泄漏?

0 投票
2 回答
7071 浏览

python - try-except-finally 代码在线程应用程序中未按预期工作

如果线程/进程被杀死,执行突然停止是有意义的

为什么在我的终端窗口点击[X]正常退出主程序时它不会执行清理代码?


我仍在学习多线程应用程序的来龙去脉,我认为我的问题来自于不了解 Python 如何处理杀死后台线程。

问题:

  1. 为什么我的块不会finally:一直执行?
  2. 什么时候不会finally:执行块?
  3. 当线程被杀死时,线程内的代码执行会发生什么?
  4. 当您退出主进程时,守护程序/非守护程序线程会发生什么?

细节:

我正在尝试使用 ZMQ 套接字编写一个多线程程序,该套接字(除其他外)将内容写入日志文件。我希望日志线程在它死之前无条件地执行一些消息传递和清理,但大多数时候不会。

下面的函数在后台线程中启动一个无限循环,并返回一个zmq.PAIR用于通信的套接字。它开始的循环侦听一个套接字,写入该套接字的任何内容都会写入文件。该循环还(应该)发诊断消息,例如“我现在开始登录!”,“糟糕,出现错误!” “我现在要退出”。所以主程序可以密切关注它。

main程序使用此模式生成一些线程来监视/控制不同的位和部分。它轮询几个 ZMQ 套接字(连接到 STDIN 和串行端口)以获取消息,并将其中的一些转发到连接到文件的套接字。

但现在我被困住了。该main程序的路由和控制逻辑工作正常。get_logfile_sock的文件写入工作正常,正常的异常处理按预期工作。但是当线程从主程序中被终止时,或者当我完全停止主程序时,“我现在退出”代码不会执行。

例子:

0 投票
2 回答
8904 浏览

java - 即使在 Junit 测试从“try”块中抛出断言错误之后,“finally”块会触发吗?

writer.close()块内的方法会finally { }在 Junit 断言错误上运行吗?

假设以下代码:

现在该finally()块会像常规流程一样运行吗?

0 投票
2 回答
162 浏览

c# - 尝试在 finally 块中

这个可以吗?将终结器作为另一个try/finally块(因为finalizer_operationX()可能会抛出,我必须确保very_critical...()最后会发生。

快速谷歌搜索try in finally 块什么都没有(如果你给我一个重复的链接,会删除问题),它应该可以工作,但我不确定它的设计和可能的问题。

0 投票
1 回答
1415 浏览

delphi - Delphi - except 和 finally 块的“正确”顺序是什么?

假设我有以下例程:

exceptfinally转置的含义是什么?我已经看到很多关于它们的帖子,但是我还没有看到一个明确的解释,说明在哪种情况下哪个是合适的(我仍然认为在上面的构造中,块在块之后执行很奇怪finally)。except

我还看到一些帖子表明混合try..excepttry..finally块不是一个好主意。在例程作为正常操作的一部分抛出异常的情况下(例如在某些 Indy 例程中),如何避免它?

0 投票
2 回答
1974 浏览

java - 为什么 Java 编译器复制 finally 块?

使用简单try/finally块编译以下代码时,Java 编译器会生成以下输出(在 ASM 字节码查看器中查看):

代码:

字节码:

在中间添加一个catch块时,我注意到编译器复制了该finally3次(不再发布字节码)。这似乎浪费了类文件中的空间。复制似乎也不限于最大数量的指令(类似于内联的工作方式),因为finally当我添加更多对System.out.println.


但是,我的自定义编译器使用不同方法编译相同代码的结果在执行时完全相同,但使用GOTO指令需要更少的空间:

为什么 Java 编译器(或 Eclipse 编译器)会finally多次复制块的字节码,甚至athrow用于重新抛出异常,而使用 可以实现相同的语义goto?这是优化过程的一部分,还是我的编译器做错了?


(两种情况下的输出都是......)

0 投票
0 回答
74 浏览

python - 为什么`finally: return 42`会清除未捕获的异常?

今天,这段有趣的 Python 代码发布在 Twitter 上

执行它时,f()返回42并且没有异常冒泡堆栈,正如我所期望的那样。当替换return 42with eg aspass语句时,异常会按预期传播到函数外部。

但是,我想知道为什么在使用return. 毕竟,还有一个未捕获的异常。

raise是否意味着 python 函数可以自动清除异常?returnreturn

0 投票
5 回答
1502 浏览

c# - try-finally 和 try-catch-throw 有什么区别?

因此,我从这个问题中了解到,finally即使发生异常并且即使异常未被捕获并允许向上传播,也可以使用块来执行代码。

我从这个问题中了解到,在 C# 中,throw可以在块中单独使用关键字(不带参数),catch以允许捕获的异常继续传播,甚至无需重置堆栈跟踪。

那么,我的问题是这两个块之间有什么区别:

不要同时运行东西 the try stuff,然后运行finally/catch stuff​​,然后允许抛出的 Exception 使用相同的堆栈跟踪传播?

0 投票
2 回答
691 浏览

python - 将整个主循环包装在 try..finally 块中是否合理?

我已经Python2.7.9为一个小项目制作了一个地图编辑器,并且我正在寻找在发生一些未处理的异常时保留我编辑的数据的方法。我的编辑器已经有了保存数据的方法,我目前的解决方案是将主循环包裹在一个try..finally块中,类似于这个例子:

这似乎是确保无论发生什么情况,都会尝试在编辑器saveFile()崩溃的情况下保留编辑器的当前状态(在能够这样做的范围内)的最佳方式。但是我想知道将我的整个主循环封装在一个try块中是否实际上是安全、高效和良好的形式。是吗?是否存在风险或问题?有没有更好或更传统的方法?

0 投票
3 回答
480 浏览

java - 在 finally 块中处理

我有一些创建 aJarFile和 a 的代码URLClassLoader,我想在最后关闭它们。自然地,我决定使用finally块来处理清理:

但是,两个close()调用都可能引发异常,因此如果jar.close()会引发异常,则loader.close()不会到达。我考虑解决此问题的一种方法是jar.close()使用 try-catch 块:

但这似乎丑陋和过分。是否有一种优雅的方式来处理finally块中与清理相关的异常?