[ 
https://issues.apache.org/jira/browse/CAMEL-13706?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Stig Rohde Døssing updated CAMEL-13706:
---------------------------------------
    Description: 
Exception propagation between RouteBuilders is currently only possible with the 
NoErrorHandler. It would be great if the DefaultErrorHandler could be 
configured to propagate exceptions it is not configured to handle. This would 
allow more Java-like exception handling for pipelines that cross RouteBuilders.

Basically the behavior I'd like from the DefaultErrorHandler is that exceptions 
thrown from a route that are not handled, and exceptions thrown from 
onException clauses, are handled the same way they would if the NoErrorHandler 
were configured. This would cause them to propagate to handlers in the parent.

An example of how this could look:
{code:java}
class RestRouteBuilder extends RouteBuilder {
  onException(Exception.class)
    .handled(true)
    .process(return a 500-series code)

  onException(JsonProcessingException.class)
    .handled(true)
    .process(return a 400-series code)

   from(rest)
     .choice()
       .when(the request is type A)
         .to(type A route)
       .otherwise()
         .to(type B route)
}

class TypeARouteBuilder extends RouteBuilder {
   setErrorHandlerBuilder(defaultErrorHandler().propagateUncaughtExceptions());

  onException(SomeRouteSpecificException.class)
     .handled(true)
     //Any exception thrown here is propagated to the RestRouteBuilder's 
onException clauses

  from(type A route)
     //SomeRouteSpecificException gets handled by the onException clause above
     //Anything else is propagated to the RestRouteBuilder's onException clauses
    .to(write to DB route)
}

class TypeBRouteBuilder extends RouteBuilder {

  setErrorHandlerBuilder(defaultErrorHandler().propagateUncaughtExceptions());
  
  onException(SomeOtherRouteSpecificException.class)
     .handled(true)
      //Any exception thrown here is propagated to the RestRouteBuilder's 
onException clauses

  from(type B route)
     //SomeOtherRouteSpecificException gets handled by the onException clause 
above
     //Anything else is propagated to the RestRouteBuilder's onException clauses
    .to(write to DB route)
}

class DBRouteBuilder extends RouteBuilder {
  setErrorHandlerBuilder(defaultErrorHandler().propagateUncaughtExceptions());

  onException(AuthenticationException.class)
     .redeliveryPolicy(new RedeliveryPolicy().maximumRedeliveries(10))

  from(type A route)
     //AuthenticationException gets handled by the onException clause above
     //Anything else is propagated to either TypeA or TypeB onException 
clauses, and possibly on to RestRouteBuilder's clauses
    .to(the DB endpoint)
}
{code}
I'd be happy to work on implementing this option, assuming there isn't 
opposition to creating a feature like this.

  was:
Exception propagation between RouteBuilders is currently only possible with the 
NoErrorHandler. It would be great if the DefaultErrorHandler could be 
configured to propagate exceptions it is not configured to handle. This would 
allow more Java-like exception handling for pipelines that cross RouteBuilders.

Basically the behavior I'd like from the DefaultErrorHandler is that exceptions 
thrown from a route that are not handled, and exceptions thrown from 
onException clauses, are handled the same way they would if the NoErrorHandler 
were configured. This would cause them to propagate to handlers in the parent.

An example of how this could look:

{code}
class RestRouteBuilder extends RouteBuilder {
  onException(Exception.class)
    .handled(true)
    .process(return a 500-series code)

  onException(JsonProcessingException.class)
    .handled(true)
    .process(return a 400-series code)

   from(rest)
     .choice()
       .when(the request is type A)
         .to(type A route)
       .otherwise()
         .to(type B route)
}

class TypeARouteBuilder extends RouteBuilder {
   setErrorHandlerBuilder(defaultErrorHandler().propagateUnknownExceptions());

  onException(SomeRouteSpecificException.class)
     .handled(true)
     //Any exception thrown here is propagated to the RestRouteBuilder's 
onException clauses

  from(type A route)
     //SomeRouteSpecificException gets handled by the onException clause above
     //Anything else is propagated to the RestRouteBuilder's onException clauses
    .to(write to DB route)
}

class TypeBRouteBuilder extends RouteBuilder {

  setErrorHandlerBuilder(defaultErrorHandler().propagateUnknownExceptions());
  
  onException(SomeOtherRouteSpecificException.class)
     .handled(true)
      //Any exception thrown here is propagated to the RestRouteBuilder's 
onException clauses

  from(type B route)
     //SomeOtherRouteSpecificException gets handled by the onException clause 
above
     //Anything else is propagated to the RestRouteBuilder's onException clauses
    .to(write to DB route)
}

class DBRouteBuilder extends RouteBuilder {
  setErrorHandlerBuilder(defaultErrorHandler().propagateUnknownExceptions());

  onException(AuthenticationException.class)
     .redeliveryPolicy(new RedeliveryPolicy().maximumRedeliveries(10))

  from(type A route)
     //AuthenticationException gets handled by the onException clause above
     //Anything else is propagated to either TypeA or TypeB onException 
clauses, and possibly on to RestRouteBuilder's clauses
    .to(the DB endpoint)
}
{code}

I'd be happy to work on implementing this option, assuming there isn't 
opposition to creating a feature like this.


> Allow conditional exception propagation to parent RouteBuilders from 
> DefaultErrorHandler
> ----------------------------------------------------------------------------------------
>
>                 Key: CAMEL-13706
>                 URL: https://issues.apache.org/jira/browse/CAMEL-13706
>             Project: Camel
>          Issue Type: New Feature
>            Reporter: Stig Rohde Døssing
>            Priority: Major
>
> Exception propagation between RouteBuilders is currently only possible with 
> the NoErrorHandler. It would be great if the DefaultErrorHandler could be 
> configured to propagate exceptions it is not configured to handle. This would 
> allow more Java-like exception handling for pipelines that cross 
> RouteBuilders.
> Basically the behavior I'd like from the DefaultErrorHandler is that 
> exceptions thrown from a route that are not handled, and exceptions thrown 
> from onException clauses, are handled the same way they would if the 
> NoErrorHandler were configured. This would cause them to propagate to 
> handlers in the parent.
> An example of how this could look:
> {code:java}
> class RestRouteBuilder extends RouteBuilder {
>   onException(Exception.class)
>     .handled(true)
>     .process(return a 500-series code)
>   onException(JsonProcessingException.class)
>     .handled(true)
>     .process(return a 400-series code)
>    from(rest)
>      .choice()
>        .when(the request is type A)
>          .to(type A route)
>        .otherwise()
>          .to(type B route)
> }
> class TypeARouteBuilder extends RouteBuilder {
>    
> setErrorHandlerBuilder(defaultErrorHandler().propagateUncaughtExceptions());
>   onException(SomeRouteSpecificException.class)
>      .handled(true)
>      //Any exception thrown here is propagated to the RestRouteBuilder's 
> onException clauses
>   from(type A route)
>      //SomeRouteSpecificException gets handled by the onException clause above
>      //Anything else is propagated to the RestRouteBuilder's onException 
> clauses
>     .to(write to DB route)
> }
> class TypeBRouteBuilder extends RouteBuilder {
>   setErrorHandlerBuilder(defaultErrorHandler().propagateUncaughtExceptions());
>   
>   onException(SomeOtherRouteSpecificException.class)
>      .handled(true)
>       //Any exception thrown here is propagated to the RestRouteBuilder's 
> onException clauses
>   from(type B route)
>      //SomeOtherRouteSpecificException gets handled by the onException clause 
> above
>      //Anything else is propagated to the RestRouteBuilder's onException 
> clauses
>     .to(write to DB route)
> }
> class DBRouteBuilder extends RouteBuilder {
>   setErrorHandlerBuilder(defaultErrorHandler().propagateUncaughtExceptions());
>   onException(AuthenticationException.class)
>      .redeliveryPolicy(new RedeliveryPolicy().maximumRedeliveries(10))
>   from(type A route)
>      //AuthenticationException gets handled by the onException clause above
>      //Anything else is propagated to either TypeA or TypeB onException 
> clauses, and possibly on to RestRouteBuilder's clauses
>     .to(the DB endpoint)
> }
> {code}
> I'd be happy to work on implementing this option, assuming there isn't 
> opposition to creating a feature like this.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to