Federico Mariani created CAMEL-26813:
----------------------------------------

             Summary: Documentation: explain error handling across routes (a 
calling route's onException does not run for a failure the called route's error 
handler dealt with)
                 Key: CAMEL-26813
                 URL: https://issues.apache.org/jira/browse/CAMEL-26813
             Project: Camel
          Issue Type: Improvement
          Components: documentation, camel-core
            Reporter: Federico Mariani


When route A calls route B (with {{direct}}, or {{seda}} with InOut) and B 
fails, the failure is dealt with by the error handler of B, the route where it 
happened. Once B's error handler is done with it (redelivery exhausted, whether 
or not the failure was handled), the error handlers and {{onException}} clauses 
of the calling routes do not run again for that failure: the callers only see 
the outcome. This also applies when B has only the default error handler (no 
{{onException}} at all). In the code this is 
{{RedeliveryErrorHandler.isDone()}} / {{isFailedOrBridged()}} in 
camel-core-processor (the failure handled / redelivery exhausted marks); for 
{{seda}} InOut, {{ExchangeHelper.copyResults}} copies those marks back to the 
caller.

The user manual does not say this anywhere, so users expect the {{onException}} 
of the calling route to run:
* {{error-handler.adoc}}: the "Scopes" section only covers per RouteBuilder / 
per route.
* {{exception-clause.adoc}}: "Scopes" only covers global / route specific.
* {{exception-advanced.adoc}}: "Global exception policies and nested error 
handlers" is about one route.
* {{try-catch-finally.adoc}}: does not say that a {{doCatch}} catches the 
failure of a called route.
Parts of the mechanism only appear as migration notes in 
{{camel-4x-upgrade-guide-4_24.adoc}}.

Typical consequences:
* {{onException(...).handled(false)}} in B gives the exception back to A, but 
A's {{onException}} does not run.
* To handle the failure in A instead: B uses {{errorHandler(noErrorHandler())}} 
(B then has no redelivery or {{onException}} of its own, and a redelivery in A 
sends the message to {{direct:B}} again, so the whole of B is retried, as the 
existing section "How do I retry processing a message from a certain point back 
or an entire route" shows), or A calls B inside {{doTry ... doCatch}}, and the 
{{doCatch}} catches it.

*Planned doc change*
* error-handler.adoc: a short section "Error handling across routes" after 
"Scopes" with the rule, {{seda}} InOut, the two ways to handle the failure in 
the calling route (with the cost of {{noErrorHandler}}), and a small example.
* exception-clause.adoc ("Scopes") and try-catch-finally.adoc: short 
cross-links.
* A focused test in camel-core that pins each statement of the new section on 
main.

Motivating user question (Camel 4.17, unanswered): 
https://stackoverflow.com/questions/79891038

Related: CAMEL-26447 (doTry: after a doCatch caught the failure of a called 
route that failed unhandled, the later error handlers of the exchange treat it 
as done). The new section does not describe what happens after the {{doCatch}}, 
which CAMEL-26447 may change. See also CAMEL-26332, CAMEL-26333, CAMEL-26434.

_Claude Code on behalf of Federico Mariani_



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to