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

c++ - C++ 是否支持“最终”块?(我一直听到的这个“RAII”是什么?)

C++ 是否支持“ finally ”块?

什么是RAII 成语

C++ 的 RAII 习语和C# 的“使用”语句有什么区别?

0 投票
3 回答
42029 浏览

javascript - 使用 try .. catch .. finally 处理 Javascript 错误

我怀疑我finally错误地使用了该块,并且我不了解其用途的基本原理...

此函数将运行该catch块,警告“错误”,但随后返回 true。为什么它不返回假?

0 投票
5 回答
6824 浏览

c++ - 正确替换 C++ 中缺失的“finally”

由于finallyC++中没有,因此如果您希望代码具有异常安全性,则必须改用 RAII设计模式。一种方法是使用本地类的析构函数,如下所示:

与直接解决方案相比,这是一个很大的优势,因为您不必编写 2 次清理代码:

本地类解决方案的一大缺点是您不能直接访问清理代码中的局部变量。因此,如果您需要访问它们,它将使您的代码膨胀很多:

所以我的问题是:有没有结合这两种优势的解决方案?这样您 a) 不必编写重复的代码,并且 b) 可以访问清理代码中的局部变量,就像task在上一个示例中一样,但没有这样的代码膨胀。

0 投票
6 回答
1964 浏览

c++ - 是否存在“最终”构造在 C++ 中有用的情况?

Bjarne Stroustrup 在他的C++ Style and Technique FAQ中写道,强调我的:

因为 C++ 支持几乎总是更好的替代方案:“资源获取即初始化”技术(TC++PL3 第 14.4 节)。基本思想是用一个本地对象来表示一个资源,这样本地对象的析构函数就会释放资源。这样,程序员就不会忘记释放资源。例如:

在一个系统中,我们需要为每个资源创建一个“资源句柄”类。但是,我们不必为每次获取资源都有一个“finally”子句。在现实系统中,资源获取远多于资源种类,因此“资源获取即初始化”技术导致的代码比使用“finally”构造更少。

请注意,Bjarne 写的是“几乎总是更好”而不是“总是更好”。现在我的问题是:在什么情况下finally构造比在 C++ 中使用替代构造 (RAII) 更好?

0 投票
6 回答
26220 浏览

c++ - 终于在 C++ 中

这是在标准 C++ 中实现类似最终行为的好方法吗?(无特殊指针)

  1. 对象没有抛出异常 -> NoException -> 对象已清理
  2. 对象抛出的异常 -> 已处理 -> NoException -> 对象已清理
  3. 对象抛出的异常 -> 抛出 -> 异常 -> 对象清理 -> 抛出
0 投票
12 回答
82421 浏览

java - finally 块是否总是运行?

是否存在最终可能无法在 java 中运行的情况?谢谢。

0 投票
15 回答
60476 浏览

java - 在 finally 块中抛出异常

有没有一种优雅的方法来处理finally块中抛出的异常?

例如:

你如何避免块中的try/ ?catchfinally

0 投票
15 回答
3165 浏览

c++ - 在 C++ 中模仿 Java 的 try/finally 是否有一个受欢迎的习语?

多年来一直在做 Java,所以一直没有跟踪 C++。语言定义中的 C++ 异常处理中是否添加了finally子句?

是否有模仿 Java 的 try/finally 的流行习语?

我还担心 C++ 没有针对所有可能抛出的异常的终极超类型——比如 Java 的 Throwable 类。

我可以写:

附录编辑:

我最终接受了投票最多的答案,即使用析构函数进行清理。当然,从我自己的评论来看,很明显我并不完全同意这一点。然而,C++ 就是这样,所以在我想到的应用程序努力中,我将或多或少地努力坚持共同的社区实践。我将使用模板类来包装还没有类析构函数的资源(即 C 库资源),从而赋予它们析构函数语义。

新附录编辑:

嗯,而不是finally然后是一个关闭功能?结合 ScopeGuard 方法的闭包(请参阅下面的答案之一)将是一种通过任意操作完成清理并访问清理代码的外部范围上下文的方法。清理可以以 Ruby 编程中的惯用方式完成,在打开资源时它们提供清理块。是否没有考虑 C++ 的闭包功能?

0 投票
10 回答
24317 浏览

java - 在 Java 中,是否保证调用“finally”块(在 main 方法中)?

我是一名 Java 菜鸟,我想知道,如果我有以下典型的 Java 代码

JVM 是否保证 finally 块将始终运行?为了理解我从哪里来,我已经习惯了 C/C++ 程序,如果你取消引用一个 NULL 指针并且你不能在此之后运行任何代码,这些程序可能会崩溃。

但据我了解 Java 和整个 GC / 托管内存业务一般来说,没有空指针解引用之类的东西,一切都是可捕获的预期,所以我的程序实际上没有办法崩溃,可以让它跳过 finally ,或者有吗?例如,在 Python 中,我通常会这样做

而且我从来没有让任何应用程序在不通过我的代码的情况下死掉。

当然,如果操作系统出于某种原因杀死了进程(或者如果某些东西杀死了整个系统,比如拔掉插头),那么 Java 就无能为力了。此外,从 PHP 中,我知道您无法防范的不可捕获的错误,即使解释器在它发生后仍然存在(至少它能够输出正确的消息)。

编辑:为了清楚起见(任何人都没有真正误解它),让我补充一点,我正在寻找我的代码中可能导致最终被绕过的东西。所以指向 System.exit 是一个有用的提醒,即使我不明白为什么我想做这样的事情。

JVM 退出是一种相当明显的方式,我将其视为外部原因。指出您还必须记住在 JVM 和应用程序继续运行时线程退出的可能性非常有帮助,因为即使现在对我来说似乎也很明显,但我没有想到这一点。

0 投票
4 回答
3318 浏览

python - 返回吃异常

我发现以下行为至少很奇怪

当您returnfinally子句中使用时,异常会消失。那是一个错误吗?这在任何地方都有记录吗?

但真正的问题(以及我将标记为正确的答案)是:
python 开发人员允许这种奇怪行为的原因是什么?