如何打开 Guice ProvisionException?

How can I unwrap Guice ProvisionException?

万一在 Guice 创建 class 时抛出异常 ProvisionException 包装原始异常。

有没有办法强制抛出原始异常?

例如:

@Inject
public myClass() {

  throw new MySpecificException();
}

我知道,我可以抓住 ProvisionException 并调用 getCause() 解包并到达 MySpecificException。但是,如果可能的话,我更愿意改写默认的 Guice 异常。

不,你不能。

ProvisionException 做的不仅仅是包装一个异常; Guice 被设置为一次捕获许多异常,将它们汇总为一个异常,然后向您发送一条方便、有用的消息以找出问题所在。

例如,在 Guice 源代码中有很多 code like this:

try {
  result = callable.call();
  // Make sure we don't return the provisioned object if there were any errors
  // injecting its field/method dependencies.
  errors.throwIfNewErrors(numErrorsBefore);
} catch(ErrorsException ee) {
  exceptionDuringProvision = ee;
  throw new ProvisionException(errors.merge(ee.getErrors()).getMessages())
}

错误处理系统集成得如此之深,以至于您无法将其提取出来;而且,老实说,你为什么要这样做?这样做的全部意义在于让您轻松隔离问题。如果你得到 ProvisionException,这意味着 你的代码做错了,需要改变 ;它不是那种你可以恢复和 return 到正常操作的东西。

在我的生产系统中,我在不同的地方捕获了许多异常并处理它们,记录它们并尝试恢复。但是,ProvisionException 不是其中之一;如果我的系统抛出它,我希望整个该死的东西都崩溃,这样我就可以立即找出并修复它。 (当然,当我部署新版本时,它已经过全面测试,所以我知道,至少,如果有问题,那不会是 ProvisionException)。