class MyRouteBuilder extends SpringRouteBuilder {
public void configure() throws Exception {
//initialize camel context here
onException(ChildException.class)
.process(new ChildExceptionHandler())
.handled(true)
.to(errorURI);
onException(ParentException.class)
.process(new ParentExceptionHandler())
.handled(true)
.to(errorURI);
from(startURI)
.processRef("someBeanID")
//other processing here
}
}
现在我的“someBeanID”在处理时抛出ChildException,但是为此调用了ParentExceptionHandler。 “someBeanID”中的代码片段如下所示
try {
//some processing
throws new ParentException();
} catch (ParentException e) {
throw new ChildException(e); //being handled by ParentExceptionHandler (why?? should be ChildExceptionHandler??)
throw new ChildException(); //being handled by ChildExceptionHandler (should be)
}
似乎每当我们包装任何异常时,Camel会自动找到实际的包装异常并为其调用处理程序,而不是为包装器异常调用处理程序。为什么是这样?我的代码有问题吗?
谢谢,
答案 0 :(得分:1)
最终解决....请参阅this
当捕获多个异常时,onException子句的顺序很重要。 Apache Camel最初尝试将抛出的异常与第一个子句进行匹配。如果第一个子句无法匹配,则尝试下一个onException子句,依此类推,直到找到匹配项。每个匹配尝试由以下算法控制:
如果抛出的异常是一个链式异常(也就是说,异常被捕获并作为不同的异常重新抛出),最嵌套的异常类型最初用作匹配的基础。此异常测试如下:
如果测试异常完全具有onException子句中指定的类型(使用instanceof测试),则会触发匹配。
如果要测试的异常是onException子句中指定类型的子类型,则触发匹配。
如果最嵌套的异常无法产生匹配,则会测试链中的下一个异常(包装异常)。测试继续进行,直到触发匹配或链条耗尽为止。