Try …​ Catch …​ Finally

Camel supports the Java equivalent of try .. catch and finally directly in the DSL. It aims to work like its Java sisters but with more power.

In Camel we prefix the keywords with do to avoid having same keyword as Java. So we have:

  • doTry

  • doCatch

  • doFinally

  • end to end the block in Java DSL

Camel error handling is disabled

When using doTry .. doCatch .. doFinally then the regular Camel Error Handler does not apply. That means any onException or the likes does not trigger. The reason is that doTry .. doCatch .. doFinally is in fact its own error handler and that it aims to mimic and work like how try/catch/finally works in Java.

About doCatch and its power over Java

The doCatch in Camel is empowered over its Java sister.

First of all you can define multiple exceptions to catch in a single block.

And second of all an important aspect over the regular Java counter parts is that Camel will check in the exception hierarchy when it matches a thrown exception against the doCatch blocks. The reason is that many times the original caused exceptions is wrapped by other wrapper exceptions, typically transposing the exception from a checked to a runtime exception. Camel for instance does this by wrapping it in a RuntimeCamelException. So if the original caused exception is an java.io.IOException then Camel will still match a doCatch block defined with an java.io.IOException. And just like Java the order in which you have multiple doCatch blocks matters. Camel will iterate from the top going down and use the first doCatch that matches the exception. The reason is to keep it similar to the regular java and how it selects a catch block. This differs from the Exception Clause that has a more intelligent exception selection strategy among multiple onException definitions, where it also considers the delta in the exception hierarchy to select the best definition.

A third feature is that you can attach a onWhen predicate to signal if the catch should trigger or not at runtime.

Using try .. catch .. finally in Java DSL

In the route below we have all keywords in action. As the code is based on a unit test we route using Mock.

And finally we have an example of the onWhen predicate in action. We can attach it to a doCatch block and at runtime determine if the block should be triggered or not. In our case we only want to trigger if the caused exception message contains the damn word.

Use end() to end the block

Notice when using Java DSL we must use end() to indicate where the try .. catch .. finally block ends. As the example above has a finally, then the end() should be at the end of the finally block. If we are not using a finally, then the end() should be at the end of the doCatch to indicate the end there.

Using try .. catch .. finally in Spring DSL

In the route below we have all keywords in action. As the code is based on a unit test we route using Mock.

And finally we have an example of the onWhen predicate in action. We can attach it to a doCatch block and at runtime determine if the block should be triggered or not. In our case we only want to trigger if the caused exception message contains the damn word.