我在 Camel 环境中遇到onException问题。我使用的是通用错误处理程序,它会在发生异常时尝试使用xpath从交换中提取其他错误信息。 onException包含try/catch子句,可防止引发其他错误。
<onException>
<exception>java.lang.Exception</exception>
<handled>
<constant>true</constant>
</handled>
<!-- Try to get additional error information from the exchange-->
<doTry>
<setProperty name="error.code">
<xpath resultType="java.lang.String">//*[local-name()='error'][1]/@code</xpath>
</setProperty>
<doCatch>
<exception>java.lang.Exception</exception>
</doCatch>
</doTry>
</onException>
问题是,当xpath失败时(例如,当body不是xml时),try/catch似乎没有捕获异常。而是调用FatalFallbackErrorHandler并记录以下异常:Content is not allowed in prolog.: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
最佳答案
如您所见,onException
块中的try/catch没有任何帮助。
每当处理错误期间发生异常时,FatalFallbackErrorHandler
就会加入。这是Camel的“紧急中断”。您无法更改,它会执行以下操作:
这是为了防止错误处理程序之间发生无休止的循环循环,或者防止错误处理程序引发错误时可能出现的其他问题。
您可以尝试做的(我想我从未尝试过)是为收集错误信息创建专用的
direct
路由。您可以使用
.to("direct:collectErrorInformation")
从错误处理程序中调用它。如果xpath引发错误,则您处于正常路由中,并且如果还为验证错误添加了
onException
块,则可以正常处理。如果您愿意,请尝试一下。