【问题标题】:Unable to handle Exception properly in spring boot pubsub app无法在 Spring Boot pubsub 应用程序中正确处理异常
【发布时间】:2019-12-12 11:40:34
【问题描述】:

这是我遇到问题的代码:

try {
    publisher.publish(payload).get();
} catch (com.google.api.gax.rpc.DeadlineExceededException e) {
    LOGGER.error("com.google.api.gax.rpc.DeadlineExceededException occured: " + e.getCause());
} catch (com.google.api.gax.rpc.NotFoundException e) {
    LOGGER.error("com.google.api.gax.rpc.NotFoundException occured: " + e.getCause());
} catch (com.google.api.gax.rpc.ApiException e) {
    LOGGER.error("com.google.api.gax.rpc.ApiException occured: " + e.getCause());
} catch (io.grpc.StatusRuntimeException e) {
    LOGGER.error("io.grpc.StatusRuntimeException occured: " + e.getCause());
} catch (java.lang.RuntimeException e) {
    LOGGER.error("RuntimeException occured: " + e.getCause());
} catch (java.util.concurrent.ExecutionException e) {
    LOGGER.error("java.util.concurrent.ExecutionException occured: " + e.getCause()); // my program cursor always come to this point
} catch (Exception e) {
    LOGGER.error("Exception occured: " + e.getCause());
}

而 ExecutionException catch 的 getCause 是:

java.util.concurrent.ExecutionException 发生: com.google.api.gax.rpc.NotFoundException: io.grpc.StatusRuntimeException: NOT_FOUND: 找不到资源

如果您看到我已经将“com.google.api.gax.rpc.NotFoundException”的捕获放在第二个捕获中,那么为什么它进入了 ExcutionException 捕获。

由于这种性质,我无法为客户编写适当的消息来解决。

如果有人可以提供帮助,请提前致谢。

【问题讨论】:

    标签: spring-boot exception exceptionhandler


    【解决方案1】:

    当 publisher.publish(payload).get() 被执行时,它会抛出 java.util.concurrent.ExecutionException ex= new com.google.api.gax.rpc.NotFoundException() 即 java.util. util.concurrent.ExecutionException 但 com.google.api.gax.rpc.NotFoundException 的对象。因此在 try catch 中,当引用检查要执行哪个 catch 块时,它无法通过 api.gax.rpc.NotFoundException() 因为 cactch 仅捕获相同或超类,因此它稍后被捕获,但由于对象是由 com. google.api.gax.rpc.NotFoundException 所以 getCause 被覆盖,当你执行它时,对象方法被调用。

    分辨率:例如

    try{
    
    }
    catch(Exception e){
                throw (e.getClass()).cast(e);
    
    }
    

    你可以把这个 catch 块放在 java.util.concurrent.ExecutionException 中。

    【讨论】:

    • 好的我能理解,但是现在我如何才能让 ExceutionException 抛出 NotFoundException,有没有合适的方法来处理这种情况。
    • catch (Exception e) { Exception exception=(e.getClass()).cast(e);抛出异常; } 。试试这个
    • 这会做什么,我想捕获 NotFoundException 并且只抛出 NotFoundException 而不是只抛出异常。请纠正我。谢谢
    • 由于我们只抛出异常,它进入了父类的异常捕获块,这不是我想要的预期行为。
    • 我确实使用过相同的,但它再次进入异常类,我在使用后检查: throw (e.getClass()).cast(e);它只给了我异常类的对象(即 ExecutionException)。那么它将如何进入父类 NotFoundException 捕获块。
    猜你喜欢
    • 2018-11-07
    • 1970-01-01
    • 2018-07-18
    • 2017-05-10
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多