blob: a24c3b0699c17f24413e334ce78393a6103968b7 [file] [log] [blame]
= How do I retrieve the thrown Exception during processing an Exchange?
You have send an Exchange to Camel but it fails during processing caused
by a thrown Exception. How do I retrieve this Exception?
If you are using CamelTemplate (or CamelProducer), then it is common to
use the sendBody/requestBody methods that returns the exchange body
response *only*. So if there was a thrown exception during processing
Camel is not rethrowing this Exception. To remedy this you can use the
plain send/request methods that accepts an Exchange object and returns
an Exchange object.
From the returned Exchange you can test if it has failed and get the caused
exception. This is illustrated in the code sample:
[source,java]
----
@Test
public void testOk() {
int result = (Integer) template.sendBody("direct:input", ExchangePattern.InOut, "Hello London");
assertEquals(1, result);
}
@Test
public void testFailure() {
// must create an exchange to get the result as an exchange where we can get the caused exception
Exchange exchange = getMandatoryEndpoint("direct:input").createExchange(ExchangePattern.InOut);
exchange.getIn().setBody("Hello Paris");
Exchange out = template.send("direct:input", exchange);
assertTrue("Should be failed", out.isFailed());
assertTrue("Should be IllegalArgumentException", out.getException() instanceof IllegalArgumentException);
assertEquals("Forced exception", out.getException().getMessage());
}
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
public void configure() throws Exception {
from("direct:input").bean(new ExceptionBean());
}
};
}
public static class ExceptionBean {
public int doSomething(String request) throws Exception {
if (request.equals("Hello London")) {
return 1;
} else {
throw new IllegalArgumentException("Forced exception");
}
}
}
----