问题标签 [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 投票
1 回答
1708 浏览

c# - Response.Redirect() 在 try-finally 中

可能重复:
重定向后代码最终会运行吗?

你好,

当我调用 Response.Redirect() 并将 EndResponse 设置为 true/false 时会发生什么情况?finally 会被调用吗?

0 投票
7 回答
64061 浏览

delphi - 如何正确编写 Try..Finally..Except 语句?

以以下代码为例:

如果该部分发生错误// do something,我假设创建的 TSomeObject 将不会被释放,并且 Screen.Cursor 仍将作为沙漏卡住,因为代码在到达这些行之前就被破坏了?

现在除非我弄错了,否则应该有一个异常语句来处理任何此类错误的发生,例如:

现在,除非我在做一些非常愚蠢的事情,否则应该没有理由在 finally 块和之后以及在 Exception 块中使用相同的代码两次。

基本上我有时会有一些可能类似于我发布的第一个示例的程序,如果我收到错误,光标会卡在沙漏上。添加异常处理程序会有所帮助,但这似乎是一种肮脏的做法——它基本上忽略了 finally 块,更不用说从 finally 复制粘贴到异常部分的丑陋代码了。

如果这似乎是一个直截了当的问题/答案,我仍然在学习 Delphi,所以很抱歉。

如何正确编写代码以处理语句并正确释放对象和捕获错误等?

0 投票
2 回答
3439 浏览

delphi - 使用“try finally”的数据库连接

有人可以启发我使用 try finally 处理数据库连接(和错误)吗?最佳做法是什么?见过各种风格,但我想知道最好的方法是什么。应该将表的打开放在 TRY 块中还是仅放在主连接字符串中?因为我通常把我的数据库(绝对数据库,访问..)放在我的 exe 文件夹中,所以我想知道最好的方法......或者首先检查文件......

???

0 投票
2 回答
715 浏览

c# - C# 控制台应用程序未调用 finally 块

我正在编写一个控制台应用程序以作为计划任务运行,当您使用关闭按钮关闭它时,它似乎没有执行运行代码的 finally 块。我尝试使用以下非常简单的控制台应用程序复制此行为:

当通过调试器运行时,这不会Console.WriteLine在行上遇到断点。我不确定这个简单的测试是否按预期工作,或者为什么 finally 块似乎没有在这个测试或我的生产代码中运行。

我认为 finally 块总是运行(这不是它们的全部意义吗?)。这里发生了什么?

0 投票
1 回答
126 浏览

python - 在 python 中维护可回滚的代码流,无需极端识别

我遇到了这样一种情况,我正在处理一段代码,在该代码中我命令对远程对象进行更改(即我无法复制以在克隆上工作的代码),然后要求远程对象在新状态并通过一系列相反的命令恢复我对其所做的所有更改。问题是,如果在所有这些更改中遇到错误,我希望能够回滚到目前为止所做的所有更改。

我想到的最合适的解决方案是 python try-finally 工作流程,但是当命令序列很长时,它会出现相当大的问题:

这样,我需要的命令越多,我的缩进和嵌套就越深,我的代码可读性就越低。我考虑过其他一些解决方案,例如维护一个堆栈,对于每个命令,我都会推送一个回滚操作,但这可能会变得相当复杂,而且我不喜欢将绑定方法推送到堆栈中。我还考虑过为我执行的每个操作增加一个计数器,然后根据计数器最终决定我想要的回滚类型,但同样,此类代码的可维护性变得很痛苦。

我在搜索“事务”和“回滚”时获得的大多数点击都与数据库相关,并且不太适合更通用的代码......任何人都知道如何系统地平息这种暴行?

0 投票
2 回答
202 浏览

c++ - 如何确保(如最终尝试)销毁 HEAP-ALLOCATED 对象

我正在寻找一种方法来确保在堆上执行的对象在我完成后总是被释放。

我知道如果它是在堆栈上分配的,我可以使用 RAII 来确保它会得到照顾 - 不幸的是,这对我不起作用(至少直接),因为有问题的对象实际上是通过调用 api 函数创建的,然后返回指向它在堆上创建的对象的指针。

所以,从概念上讲,我想做的是:

我唯一能想到的就是创建某种虚拟清理类,并在堆栈上创建一个实例:

有没有更好的方法来实现这一点?或者这是公认的解决方案?

0 投票
6 回答
2109 浏览

java - 关于嵌套 Java try/finally 代码三明治的建议

我想要一些关于我碰到的技术的建议。通过查看代码片段可以很容易地理解它,但我在以下段落中对其进行了更多记录。


使用“代码三明治”习语来处理资源管理是司空见惯的。习惯了 C++ 的 RAII 习语后,我切换到 Java 并发现我的异常安全资源管理导致了深度嵌套的代码,其中我很难掌握常规控制流。

显然( Java 数据访问:这种 Java 数据访问代码的风格很好,还是 try finally 太多了?Java io 丑陋的 try-finally 块等等)我并不孤单。

我尝试了不同的解决方案来解决这个问题:

  1. 显式维护程序状态:resource1aquiredfileopened...,并有条件地清理:if (resource1acquired) resource1.cleanup()... 但是我避免在显式变量中复制程序状态 - 运行时知道状态,我不想关心它。

  2. 将每个嵌套块包装在函数中 - 导致更难遵循控制流,并导致非常尴尬的函数名称:runResource1Acquired( r1 ), runFileOpened( r1, file ), ...

最后我得到了一个成语,也(在概念上)得到了一些关于代码三明治的研究论文的支持:


而不是这个:

使用辅助构造,您可能会得到一个更线性的构造,其中补偿代码就在发起者旁边。

嵌套代码变为线性:

我很高兴:无论有多少异常路径,控制流都保持线性,并且清理代码在视觉上位于原始代码旁边。最重要的是,它不需要人为限制的closeQuietly方法,这使得它更加灵活(即不仅是Closeable对象,还有DisconnectableRollbackable以及其他任何东西)。

但...

我发现其他地方没有提到这种技术。那么问题来了:


这种技术有效吗?你在其中看到了什么错误?

非常感谢。

0 投票
2 回答
588 浏览

c# - 最后阻止在 Application.Run(new main_form) 之后不执行

我想在我的程序退出之前执行一些代码,所以我认为编辑到 VS 创建的 Program.cs 看起来像:

可以解决问题,但是special_shutdown_code()当我单击主窗体右上角的 [x] 时,我没有被执行。我回去并添加了打印语句:

“之前”是唯一打印的输出。

从我读到的 Application.Run 函数应该返回。我迷路了。任何解释将不胜感激。

这是一个 C++/CLR + C# + C 混合程序,但主要部分是 C#。

我希望得到关于没有发生的事情的解释,而不是关于如何完成相同功能的建议。在大多数情况下,我能够解决这个问题,但是看起来最干净、最容易理解并且正确的方法根本不起作用让我感到困惑。

0 投票
4 回答
9771 浏览

delphi - finally 块中的语句是否仍然在这段代码中执行?

最终会阻塞执行吗?如果我通过出口;?

0 投票
4 回答
8793 浏览

exception-handling - 如何在没有它们的语言中模拟 try-finally 或 try-except

没有办法模拟没有它们的语言try-finally或语言?try-except

如果有一些随机的、不可预测的异常发生,我需要确保运行一些清理。

可以尝试确保没有抛出异常,这样我就可以确定我的清理代码总是运行 - 但是我不需要try-finally/except.

此刻我正在尝试try-finally在 Lua 中创建一个;但我认为任何解决方案也适用于其他语言。

虽然,在我的一生中,如果没有语言基础设施提供的管道,我无法弄清楚如何处理异常。

但从来没有伤害过问。