Você não pode capturar erros com trap ... ERR
nos comandos que tiveram seu código de saída testado. No seu caso particular, na página man bash:
The ERR trap is not executed if the failed command is ... part of a command executed in a && or || list except the command following the final && ...
De modo geral, a maneira mais simples de garantir a limpeza de um conjunto de funções é executá-las em uma subcamada e, no entanto, quando você sai, você ainda pode fazer a limpeza.