Das Nicht-Finden eines gesuchten Ausdrucks oder Objekts würde ich nicht als Failure bezeichnen, sondern es ist einer der zu betrachtenden Normalfälle.
Der Failure (das Versagen) passiert dann, wenn der Programmierer einen der Fälle nicht beachtet. Man spricht dann von einem Defekt. Der Defekt ist noch kein Fehler, er wird erst zu einem, wenn wirklich mal ein Element nicht in einer Liste gefunden wird. Das kann auch erst Tage, Wochen oder Jahre nach Start des Programms passieren.
Beim false
-Rückgabewert kann der Fehler zudem in einem völlig anderen Teil des Programms auftreten. Das macht es dann schwierig die Ursache, den Defekt, zu lokalisieren. Man spricht deshalb von einem "Silent Failure".
Bei der Exception tritt der Fehler genau beim Defekt auf.
Dieser zusätzliche Arbeitsaufwand beim Aufspüren des Defekts im Falle des Silent Failures, ist das was letzen Endes reales Geld kostet. Solange der Fehler noch nicht aufgetreten ist, sind es "nur" technische Schulden.