如何报告一个StackOverflowError而不触发另一个StackOverflowError?

问题描述 投票:0回答:1

我有以下情况:

我的代码很容易出现

StackOverflowError
。这最终必须重写,但就目前而言,重要的是在它消失之前可靠地报告情况。

事情是,创建错误消息并将其提交到日志框架本身需要堆栈空间。可能有大量的堆栈空间;我遇到了一个值得注意的情况,即在加载日志记录所需的所有类之前堆栈溢出,因此类加载器内部发生了另一个堆栈溢出,从而掩盖了原始堆栈溢出。

请注意,在希望软件继续运行的情况下,这些崩溃可能并且确实会发生。 我目前的情况是单元测试,其中一些测试可能会溢出堆栈(实际上是预期的),但我仍然想查看其他测试的结果。 另一种可能的情况是服务器发生堆栈溢出;它不应该仅仅因为正在处理的多个请求之一遇到堆栈溢出而需要重新启动。

我可以想象各种方法来处理这个问题,但是是否有对各种方法、它们在实践中如何工作以及它们可以依赖的 JVM 保证的讨论? 例如。 JVM 是否保证在

StackOverflowError
上保留一些堆栈空间,如果是,规范在哪里?

java logging stack-overflow
1个回答
0
投票

只需让

StackOverflowError
展开堆栈,并从调用递归的第一个非递归函数中报告它。 感谢 user207421 的想法,它非常干净,实际上是我认为的首选解决方案。

如果您不控制调用递归的代码,请将递归调用包装到一个新函数中,该函数捕获并报告

StackOverflowError

您经常希望从每个递归级别创建值的跟踪。这将是一个非常长的异常消息,而且会很复杂,因为您希望开始在堆栈中尽可能深入地进行报告,而不会使报告机制溢出堆栈。 我试图在这里写一个菜谱,但它变得太复杂了,所以我想它将成为 Maven Central 的一个库。

© www.soinside.com 2019 - 2024. All rights reserved.