代码之家  ›  专栏  ›  技术社区  ›  Drejc

如何打开Guice ProvisionException?

  •  1
  • Drejc  · 技术社区  · 9 年前

    在Guice创建类a时引发case和异常 ProvisionException 包装原始异常。

    是否有方法强制抛出原始异常?

    例如:

    @Inject
    public myClass() {
    
      throw new MySpecificException();
    }
    

    我知道,我能抓住 提供例外情况 并呼叫 getCause() 打开并到达 MySpecificException 然而,如果可能的话,我更希望替代默认的Guice异常。

    1 回复  |  直到 9 年前
        1
  •  2
  •   Community Tales Farias    4 年前

    不,你不能。

    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())
    }
    

    错误处理系统集成如此之深,以至于您无法将其提取出来;老实说,你为什么要这样做?这样做的全部目的是让你很容易隔离问题。如果你得到了 提供例外情况 ,这意味着 您的代码做了错误的事情,需要更改 ; 这不是那种你可以从中恢复并恢复到正常操作的事情。

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