Service tasks of "Expression" and "Delegate expression" types don't properly handle BpmnError exceptions. They are treated like any other regular RuntimeException. Only "Java class" based service tasks do it well. I've added a patch that fixes this issue. As you can see, the code that is responsible for handling exceptions is exactly the same for ServiceTaskDelegateExpressionActivityBehavior and ServiceTaskExpressionActivityBehavior classes, so it would be probably a good idea to moved it to an abstract/utility class if you decide to use it.
I've found out that this issue was discussed here: