如果Guice创建类a时抛出异常
ProvisionException包装原始异常。

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

例如:

@Inject
public myClass() {

  throw new MySpecificException();
}


我知道,我可以捕获ProvisionException并调用getCause()进行解包并转到MySpecificException。但是,如果可能的话,我宁愿替代默认的Guice异常。

最佳答案

不,你不能。

ProvisionException除了包装一个Exception外,还有很多其他功能; 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,则意味着您的代码做错了事,需要更改;这不是您可以从中恢复并恢复正常操作的事情。

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

关于java - 如何解开Guice ProvisionException?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32241895/

10-08 23:34