code: @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
          if (throwable != null) {
              throw throwable;
          }
          try {
              return invokeInternal(proxy, method, args);
          } catch (Exception e) {
              if (this.throwable != null) {
                  logger.debug("exception caught: {} overridden by: {}", e.getMessage(), throwable.getMessage());
                  throw throwable;
              } else {
                  throw e;
              }
          }
      }
docs: The InvocationHandler invoke method is mapped to the ProxyInvocationHandler.invokeInternal