gpt4 book ai didi

java - 链式异常中的循环

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:09 25 4
gpt4 key购买 nike

我将首先用我的用例快速提出问题。我的库需要将 Java 异常分类器暴露给它所插入的框架。例如:

enum Classification { FATAL, TRANSIENT, UNKNOWN }

Classification classify(Throwable t) {
if (t instanceof MyTransientException)
return Classification.TRANSIENT;
else if (t instanceof MyFatalException)
return Classification.FATAL;
else
return Classification.UNKNOWN;
}

有时,出于我无法控制的原因,传递的异常是我感兴趣的异常的包装器,所以我想搜索它的原因链。我最初的想法是:

Classification classify(Throwable t) {
if (t == null)
return Classification.UNKNOWN;

if (t instanceof MyTransientException)
return Classification.TRANSIENT;
else if (t instanceof MyFatalException)
return Classification.FATAL;
else
return classify(t.getCause());
}

不幸的是,如果传递的异常在其因果链中有一个循环,这可能会导致无限递归。传递这样的异常的可能性极小,如果创建了这样的异常,则可以说这是系统其他地方的错误,但我对我的库可能负责生产感到非常不舒服如果发生停电。 Throwable 的 API 和 javadoc 没有明确禁止这种可能性,除了循环在因果链中本质上是荒谬的想法之外。

我注意到Guava 有一个@Beta 方法来提取因果链,Throwables.getCausalChain ,但它的实现容易受到同样问题的影响——它最终会抛出 OOME。

我打算使用 identity hash set检测周期并降低风险,但我想听听其他人如何看待这个问题。你认为我过度防御了吗?你会怎么做?

最佳答案

你这么认真真是太好了。但是您不想从事凯夫拉尔 Boot 的制造业务。

如果用户做的事情甚至会使 Throwable.printStackTrace 进入无限递归,那么该用户就无能为力了。甚至不用担心这个。

关于java - 链式异常中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com