Routine level controls error handling on routine level only.
You still need to add an 'on error undo, throw' to every for each or repeat or other transaction block.
Otherwise, any error occurring inside that block will not be caught by the top level handler.
Or am I missing something ?