gpt4 book ai didi

java - Throwable.initCause() 并通过构造函数设置原因 : why are we limited to set a single time the cause?

转载 作者:行者123 更新时间:2023-12-02 03:32:03 24 4
gpt4 key购买 nike

为什么我们只能对 Throwable/Exception 对象调用一次 Throwable.initCause()
为什么如果原因异常是由构造函数设置的,那么我们不能使用 initCause() 再次设置它?
我们可以为异常设置多个原因吗?

最佳答案

Why can we call Throwable.initCause() only once on a Throwable/Exception object ? And why if the cause exception was set by a constructor, then can we not set it again using initCause()?

Throwable.initCause() 允许我们使用不设置原因异常的构造函数实例化异常,并在第二次设置异常原因:

MyException e = new MyException();
e.initCause(rootException);

或者:

MyException e = new MyException("error message...");
e.initCause(rootException);

因此,您必须将其视为接受 Cause 异常作为参数的 arg 构造函数的替代方案:

MyException e = new MyException(rootException);

您可以一次性设置原因异常,因为它不适合修改:如果因原因引发异常,则原因不会更改。
因此,向客户端类提供这种可能性可能很容易出错。
但是语言设计者也允许设置原因异常,即使我们要实例化的异常类没有提供接受原因异常作为参数的构造函数。因此他们引入了 initCause()
但在大多数情况下,您不想使用此方法。调用传递异常原因的 arg 构造函数更简单、更直接。

Can we set more than one cause for an exception ?

不,这是不可能的:可能因为单个直接异常而发生异常
但异常可能是由多个中介/先前抛出的异常引起的。
因此,您可以链接超过 2 个异常,如前面的示例所示:

MyException e = new MyException(rootException);

例如,假设a()调用b(),而b()又调用c(),并且如果发生错误,每个方法都可能抛出异常:

void a(){  
try{
b();
}
catch(SecondException e){
throw new ThirdException(e);
}
}

void b(){
try{
c();
}
catch(FirstException e){
throw new SecondException(e);
}
}

void c(){
throw new FirstException();
}

如果所有这些方法都抛出异常,您将在 ThirdException 的最终堆栈跟踪中得到 3 个链式异常:由 SecondException 引起的 ThirdException 引起 FirstException
就像你写了:

new ThirdException(new SecondException(new FirstException()));

但作为奖励的是每个创建的异常的线程执行堆栈的快照。

关于java - Throwable.initCause() 并通过构造函数设置原因 : why are we limited to set a single time the cause?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51578619/

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