问题标签 [rethrow]

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 回答
132 浏览

exception-handling - 告诉 F# reraise 没有返回值

如何帮助 F# 编译器将重新抛出异常解释为没有返回值?

例如,考虑包装一个操作来记录异常:

编译器报告此错误reraise

这个表达式应该有类型int,但这里有类型unit -> 'a

0 投票
1 回答
368 浏览

swift - 将重新抛出函数保存为非抛出闭包

据我了解,rethrows基本上从单个声明/定义中创建了两个函数,如下所示:

如果我有一个重新抛出函数,比如f,有没有办法将它保存为“非抛出”形式的闭包?假设,像这样:

0 投票
2 回答
20797 浏览

swift - Swift 中的 throws 和 rethrows 有什么区别?

在搜索了一些参考资料以弄清楚之后,-不幸的是-我找不到有用的-简单的-关于理解和之间差异的throws描述rethrows。当试图理解我们应该如何使用它们时,这有点令人困惑。

我要提一下,我对 -default- 有点熟悉,throws它最简单的形式用于传播错误,如下所示:

到目前为止一切顺利,但是在以下情况下会出现问题:

到目前为止我所知道的是,当调用一个throws必须由 a 处理的函数时try,与rethrows. 所以呢?!在决定使用throwsor时我们应该遵循什么逻辑rethrows

0 投票
3 回答
627 浏览

java - 什么时候使用multi-catch,什么时候使用rethrow?

我对这两个主题非常不确定。我知道我应该使用 multi-catch 来处理需要以相同方式处理的异常。但出于什么目的,我真的需要这样的东西。

0 投票
0 回答
315 浏览

visual-c++ - Stackoverflow 同时由于 ntdll!RcConsolidateFrame (x64) 重新抛出异常

我正在努力解决堆栈溢出异常,该异常在重新引发不同的异常时发生。重新抛出的异常用于在递归函数调用自身超过一定次数后拆除调用堆栈。(为了防止发生堆栈溢出)

我设法编写了一个小程序,它重现了这个问题。它只发生在我使用 x64(发布和调试)编译程序时。
我用 MSVS2012 & MSVS2013 (StackSize=1MB - 默认) 测试了这个片段。对于 G++,在 about5000调用之后会出现同样的问题。

代码:

该程序的输出是:

我没想到的是堆栈溢出发生在调用堆栈大部分被清除并且只剩下 15 个调用帧需要清理的时候。似乎重新抛出异常会分配堆栈空间而不是释放它。

当我使用 WinDBG 调试程序并在堆栈溢出时打开堆栈帧 ( knf) 时,我得到以下图片:

注意:一个帧的大小位于下一行的第二列。该帧的大小
ntdll!RcConsolidateFrames( 0xf79701.014.128) 字节,因此占用了 1MB 总可用堆栈大小的 96%。

最让我烦恼的是,在调用堆栈用完并且另一个调用导致堆栈溢出之前,我可以(如截图中所述)递归调用该函数多达近 10.600 次。但是,如果我在超过 120 次调用后用异常中止递归,我再次得到堆栈溢出,这个异常是为了防止。
因此,用更大的堆栈编译程序只会将问题转移到稍高的常数上。 如前所述,此问题仅在 x64 编译时出现。如果用 Win32 编译,程序永远不会遇到堆栈溢出,一旦std::exception被抛出。

一个程序在堆栈展开期间分配的堆栈空间比它释放的更多,这有什么意义?
我该如何解决这个问题?
由于这只是一个非常简化的情况,我不能简单地用throw原始应用程序中的特殊返回值替换 。

Microsoft 连接请求(已删除)

编辑:微软只是删除了请求而没有提供任何帮助。我收到了以下答案,要求提供更多详细信息,但在我回复一天后该请求被删除。

感谢您报告此问题。虽然大堆栈的使用并不理想,但它是 EH 在 Windows 非 x86 平台上实现的重要结果。需要注意的一点是,RcConsolidateFrames 下的堆栈使用有点误导。该函数的重点是使展开器隐藏一堆中间帧,以便堆栈使用反映正在运行的 EH 机制的 105 个实例(每次执行的重新抛出一个实例),以及所有递归子调用。

您能否分享更多关于这种高堆栈使用阻塞的真实场景的信息?解决这个问题可能不是那么容易,但如果我们可以对重要的场景做出一些简化的假设,就可以改进这个问题。

谢谢,
Neeraj Singh VC++ 编译器后端开发人员

与此同时,虽然我希望,问题出在重新抛出机制上,它一遍又一遍地重新抛出分配在堆栈上的同一个异常对象。我以为其中之一

  • 复制异常并抛出异常的副本
  • 抛出异常,创建于new

可以解决问题,但结果没有区别。

0 投票
1 回答
54 浏览

c++ - catch-all-rethrow 与没有 try-catch 块有什么不同吗?

这段代码

在任何语义上都与调用不同

在 C++ 中?标准之间有区别吗?

虽然这两个片段在语义上是相同的,但我检查了编译器 - 资源管理器并生成不同的代码,即使在最高优化级别也是如此。这让我想知道我是否缺少某些东西。

0 投票
1 回答
550 浏览

swift - 如何声明重新抛出函数?

我实现了以下函数 - 作为布尔数组的扩展 - 这可能会引发CustomError错误:

按预期工作:

接下来,我尝试将函数声明为:

它应该获取结果myArray.indexOfFirstTrue()并对其进行处理(为简单起见,我们假设它打印乘以 2 的值):

我想要做的是声明handleResult重新抛出函数

可以使用 rethrows 关键字声明函数或方法,以指示仅当其函数参数之一引发错误时才引发错误。这些函数和方法称为重新抛出函数和重新抛出方法。重新抛出函数和方法必须至少有一个抛出函数参数。

Swift 编程语言 (Swift 4.1):声明 - 重新抛出函数和方法。

所以我可以用非抛出公式调用它,因此它不会抛出错误:

但是我不知道应该编辑什么才能让它成为一个重新抛出的函数,所以我试图将它声明为:

我得到了以下错误:

错误:“重新抛出”函数必须采用抛出函数参数

因此,我也尝试将其声明为:

显然得到了以下错误:

错误:无法将“Int”类型的值转换为预期的参数类型“() throws -> Int”

此时我该怎么办?

0 投票
2 回答
518 浏览

c++ - C++:对象切片和异常

在一次采访中,有人问我为什么按值捕获异常可能是个问题,我回答说这会导致对象切片。这就是我在互联网上找到的,例如这里:https ://www.viva64.com/en/w/v746/

但是现在我正在尝试进行实验,并且在按值捕获时找不到切片的示例。切片的通常场景(没有例外)是这样的:

在最后一行调用 Base 的赋值运算符,它只复制 Derived 对象的 Base 部分。因此,b1 的基于部分是从 d2 复制的,而 b1 的派生部分仍然来自 d2。坏的。

但是当按值捕获异常时怎么会发生这种情况呢?

我尝试了这段代码(同时使用:g++ 和 Sun CC 编译器):

输出是:

所以我抛出 Derived 异常,捕获它的 Base BY VALUE 并重新抛出,然后捕获 Derived BY VALUE 并且一切正常,没有任何切片。那个怎么样?

有人可以提供一个按值捕获时切片的例子吗?

0 投票
1 回答
2096 浏览

c# - 在 C# 中抛出 Catch

昨天发现了一些东西,这让我意识到我很可能仍然缺少关于 C# 的基本花絮。

我有一个无状态服务结构应用程序。我在主while循环中有一个try-catch。如果我在这个循环中抛出一个异常,它就会跳出 while 循环并且服务会有效地停止。如果我throw在 catch 子句中添加一个,服务就会重新启动。

有人可以解释为什么会这样或指导我到哪里可以得到答案吗?我找不到任何解释这种行为的东西。

编辑:这不是“投掷”和“投掷前”之间的区别吗?因为,据我所知,没有解释我的问题,为什么该函数再次运行。该主题更多地是关于解释堆栈跟踪之间的区别throw和各自的区别。throw new

0 投票
1 回答
97 浏览

c# - 为什么 c# continuewith 传递异常?

我试图在没有等待的情况下处理任务异常。我正在尝试将 ContinueWith 与 TaskContinuationOptions.NotOnRanToCompletion 一起使用。但我有一个主要问题 - 在测试程序中一切顺利,并且只能使用来自 ContinueWith 的代码。但是在我的主程序中,Exception 仍然会去 catch 块和 ContinueWith (函数不会停止工作,但我想以其他方式处理这个异常)。

小例子看起来像这样

在测试项目中一切正常,但在我的其他项目中,例外处理 2 次 - 在 catch 和 continuewith 中,并且 catch 首先执行。