问题标签 [try-catch-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 投票
4 回答
10664 浏览

java - finally 子句 java 中的 break 语句

在上面的代码中输出是'2'。我所期待的是不应该打印任何内容。'break' 在这里究竟做了什么?请解释。谢谢

0 投票
5 回答
1437 浏览

java - try-catch-finally 与抽象方法

在我们的系统中,我们有一个抽象类,我们称之为BasicAction,它包含几个抽象方法。其中最重要的称为execute。它处理来自 JSP 页面的请求。主处理程序的工作方式如下:

现在,一切看起来都很好,但基本上所有派生的处理程序都实现了相同的代码:

在我拥有的每个处理程序中编写这样的块似乎有点烦人。似乎在这里我们模仿了每个处理程序的进入/退出点,而不是应该的。我认为我们需要在BasicAction中定义另外两个抽象方法,称为createManagersdisposeManagers。然后主处理程序将如下所示:

之后,可以像这样定义每个派生操作处理程序:

哪种方法更好用 - 在每个处理程序中使用 try-catch-finally 或使用标准进入/退出点。

0 投票
1 回答
2297 浏览

java - 检索使用 ScheduledExecutorService 调度的任务实例

ScheduledExecutorService在 JEE 环境中获得了任务调度。其中一些任务在被中断时会打开资源ScheduledExecutorService.shutdownNow()(例如,使用第三方库(如 Lucene)打开文件)。

我知道一个线程可能不会自己停止执行:停止线程必须使用的方法是查看中断标志并停止方法执行,如果线程被阻塞(例如wait(),sleep()等)或者如果在可中断的通道中进行一些 IO 操作,Thread.interrupt()则会InterruptedException上升。在这两种情况下,都必须执行 finally 块。请参阅:http: //download.oracle.com/javase/1,5.0/docs/api/java/lang/Thread.html#interrupt%28%29

显然,我已经尝试在Task 类中使用一个实现非常好的finally 块来释放资源,但是在某些环境(例如CentOS)中,当线程中断时,finally 块不会被执行。然后我在官方 Java 文档中发现了这个非常酷的注释:

注意:如果在执行 try 或 catch 代码时 JVM 退出,则 finally 块可能不会执行。同样,如果执行 try 或 catch 代码的线程被中断或杀死,即使应用程序作为一个整体继续运行,finally 块也可能不会执行。

所以,我需要的是对所有计划任务的引用,以便在任务类中实现一些强制释放资源的公共方法。我可以从 中检索对任务类的引用ScheduledExecutorService吗?或者你有什么好主意可以更好地解决我的问题?

第一个解决方案:包裹它!

创建一个 Wrapper 类ScheduledExecutorService并添加如下属性:

有了它,我们可以直接访问任何 Runnable 对象,或者通过ScheduledFuture与之相关的对象。对于包装器的实例化,我可以ScheduledExecutorServiceExecutors.newScheduledThreadPool()方法中获取并将其传递给我的包装器。

另一个解决方案:扩展它!

扩展ScheduledThreadPoolExecutor,添加 IdentityHashMap 属性并覆盖所有调度或取消作业的方法,以从 Map 中添加/删除引用。

两种解决方案的问题?

如果您的包装器或扩展类的调用者收到一个对象,则可以使用该方法SchedulerFuture<?>取消作业,绕过您的“胶囊”。SchedulerFuture<?>.cancel()使用包装器,您可以避免将SchedulerFuture<?>引用传递给调用者,但使用扩展类则不能(如果您在扩展类中创建自己的方法,您将获得与包装器相同的结果,但方式非常混乱) .

优雅的解决方案:您自己的调度程序!感谢 Kaj 指出...

  1. 扩展ScheduledThreadPoolExecutor覆盖 decorateTask()方法
  2. Runnable用一个 ScheduledFuture接口的实现来装饰
  3. 实现一种自定义cancel()方法,该方法实际上取消线程,但也操纵Runnable对象以强制释放资源。

查看我的博客文章以获取详细信息和代码示例!!!

0 投票
5 回答
46493 浏览

c# - 将异常从被调用函数抛出到调用函数的 Catch 块

在上面的代码示例中,我有两个函数ReadFileReadCSVFile.
在 中ReadCSVFile,我得到一个 FileNotFoundException 类型的异常,它被 catch(FileNotFoundException) 块捕获。但是,当我抛出此异常以在ReadFile函数的 catch(FileNotFoundException) 中捕获时,它会在 catch(Exception) 块而不是 catch(FileNotFoundException) 中捕获。此外,在调试时,ex 的值显示为 Object Not Initialized。如何在不丢失内部异常或至少异常消息的情况下将异常从被调用函数抛出到调用函数的 catch 块?

0 投票
8 回答
53135 浏览

java - java中的try-catch-finally

在 Java 中,如果我们在 try-catch-finally 的 try 块中插入 return 语句,finally 块会不会被执行?

0 投票
2 回答
4895 浏览

c# - 来自 try/catch 块的收益回报

正如 Eric Lippert 在本文中所描述的,在子句中yield return是不允许的。try/catch

有没有一种很好的方法可以让我得到这样的东西,而不必自己IEnumerator手写:

0 投票
2 回答
306 浏览

python - Python try 块中的所有内容

我正在用 Python 编写一个大型批处理类型的脚本,无论是否发生异常,最后都需要进行一些清理。为此,我只需将主程序放在 try 块中,将清理放在 finally 块中。

这似乎运作良好,但我的问题是如何打印可能发生的任何异常。目前它只是忽略它们并跳转到 finally 块。

0 投票
3 回答
206 浏览

c# - 为什么我的计数器变量在多线程场景中不会回到 0?

我正在构建一个 Windows 服务基类来管理对任何挂起任务的调度表的轮询和运行它们。

Windows 服务正在使用System.Timers.Timer启动计划的表轮询。

ThreadPool.SetMaxThread在初始化计时器之前,我将其设置为 10。

计时器调用的委托方法保持运行线程的计数,以便可以在 OnStop() 方法中使用它来等待每个线程完成,然后再释放服务。

通常,当我尝试从 Windows 服务管理控制台停止服务时,该服务不会停止。如果我调试它并向 OnStop() 方法添加断点,我可以看到这不是因为 numberOfRunningThreads 卡在大于 0 的数字上(通常远大于 10!)。没有任务正在运行,它永远保持在那个数字上!

首先,我不明白这个数字怎么会大于 10,尽管ThreadPool.SetMaxThreads应该将其限制为 10?

其次,即使我没有设置最大线程数,我希望 PollWrapper 的 finally 块最终会将计数带回 0。如果计数器保持大于 0,则只能用 finally 块来解释执行,对吧!?这怎么可能?

最后,您是否会建议一种不同的方法来将轮询限制为固定数量的可能并发运行线程(.NET 3.5)?

非常感谢。

更新:

在阅读了 Yahia 关于可重入性和 SetMaxThread 的评论后,我修改了 PollWrapper,使其始终限制生成的运行线程的最大数量。我仍然会确保 Poll 是可重入的。

0 投票
1 回答
195 浏览

python - 仅在引发异常时清理对象

如果不是必须对其执行的所有操作都成功(也就是说,如果引发异常),我需要删除一个文件。它可以像使用except:一样简单,删除文件然后重新引发异常,但在这种情况下,如果由于任何神秘原因无法在except子句中删除文件,则原始异常将丢失。

我能想到的最好的是:

有人知道更好、更 Pythonic 的方法吗?

0 投票
3 回答
16956 浏览

python - Python:multiprocessing.map:如果一个进程引发异常,为什么不调用其他进程的 finally 块?

我的理解是,如果输入了 try,finally 子句必须*always* 执行。

预期的输出是对于第 8 行单独打印的每个 x,必须出现“Finally x”。

示例输出:

似乎终止一个进程的异常终止了父进程和兄弟进程,即使在其他进程中还需要完成进一步的工作。

为什么我错了?为什么这是正确的?如果这是正确的,应该如何安全地清理多进程 Python 中的资源?