如何打开 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
)。
万一在 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
)。