我试图在全局onException中捕获自己的异常。在捕获到Jaxb异常后,我抛出了Exception。但是,CustomException不会被onException捕获
onException(Exception.class)
.handled(true)
.log("Globally Caught CustomException")
.end();
from("start:direct")
.doTry()
.unmarshal(soapMessage)
.doCatch(JAXBException.class)
.log("Locally Caught JAXBException")
.throwException(new CustomException()
.endDoTry();
最佳答案
根据https://people.apache.org/~dkulp/camel/try-catch-finally.html(请参阅禁用骆驼错误处理一节),当使用doTry .. doCatch .. doFinally
时,骆驼错误处理程序不适用。因此,不会触发任何OnException
。
如果要使用OnException
捕获异常,则应直接将其引发,而不要放在DoTry .. DoCatch
内部。现在您可能会想到创建两个onException
,一个处理Exception.class
,另一个处理JAXBException.class
。
onException(Exception.class)
.handled(true)
.log("Globally Caught CustomException")
.end();
onException(JAXBException.class)
.handled(true)
.throwException(new CustomException())
.end();
但是第一个
onException
不会再次被调用,因为Camel在已经处理错误的同时不允许进一步的错误处理。这是由org.apache.camel.processor.FataFallbackErrorHandler
完成的,它捕获新的异常,记录警告,将其设置为Exchange上的异常,并停止任何进一步的路由(Camel In Action,第二版)。