处理Camel中的包装异常

时间:2014-01-28 04:43:21

标签: exception-handling apache-camel

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会自动找到实际的包装异常并为其调用处理程序,而不是为包装器异常调用处理程序。为什么是这样?我的代码有问题吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

最终解决....请参阅this

  

当捕获多个异常时,onException子句的顺序很重要。 Apache Camel最初尝试将抛出的异常与第一个子句进行匹配。如果第一个子句无法匹配,则尝试下一个onException子句,依此类推,直到找到匹配项。每个匹配尝试由以下算法控制:

     

如果抛出的异常是一个链式异常(也就是说,异常被捕获并作为不同的异常重新抛出),最嵌套的异常类型最初用作匹配的基础。此异常测试如下:

     

如果测试异常完全具有onException子句中指定的类型(使用instanceof测试),则会触发匹配。

     

如果要测试的异常是onException子句中指定类型的子类型,则触发匹配。

     

如果最嵌套的异常无法产生匹配,则会测试链中的下一个异常(包装异常)。测试继续进行,直到触发匹配或链条耗尽为止。