2

我有一个带有 doTry() 的路由 - doCatch() 对用于特定路由和 onException() 通常。

onException(Exception.class)
    .handled(true)
    .log(LoggingLevel.ERROR, "An error occurred: ${exception.stacktrace}")
    .setBody(simple("${exception}"))
    .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(500));

from("direct:mydirect")
        .routeId("myRoute")
        .doTry()
           .to("direct:internalroute")
        .doCatch(Exception.class)
            .log(LoggingLevel.ERROR, "EXCEPTION: ${exception.stacktrace}")
            .process(exceptionHandlerProcessor)
            .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(500))
            .marshal(new JsonDataFormat(JsonLibrary.Jackson))
        .doFinally()
            .log("FINALLY")
        .endDoTry();

内部路由抛出一个普通的 java.lang.Exception

 throw new Exception("Catch me if you can!");

我希望在 doCatch() 中捕获异常并执行日志记录和处理操作。但是,改为调用 onException()。

onException() 是否有更高的优先级?据我了解,本地捕捞更为优先。

PS 删除 onException() 会调用 doCatch()。但是我有理由保留两者。骆驼版是:org.apache.camel:camel-cxf:2.21.0.000033-fuse-000001-redhat-1

4

2 回答 2

4

恕我直言,这不是优先级问题,而是设计/实施问题。请参阅文档:

“onException 子句是一种捕获机制,而不是捕获异常。也就是说,一旦定义了 onException 子句,它就会捕获路由中任何点发生的异常”

于 2018-06-15T15:56:23.627 回答
4

当您有一个 doTry .. doCatch 块并且您调用另一条路线时,例如您通过

.to("direct:internalroute")

然后您需要关闭该路线上的错误处理,例如在

from("direct:internalroute")
  .errorHandler(noErrorHandler())

如果您希望所有错误处理仅通过 doTry .. doCatch 块进行。

于 2018-06-16T07:54:35.933 回答