in einem vanilla Shop kann save() eine Exception werfen, wenn OXID denkt, dass es ein vorhandener Datensatz aktualisiert, das oxUser Objekt aber keine ID hätte.
Siehe protected function _update() im BaseModel.
Aber wenn das passiert, dann stimmt etwas mit der DB nicht und es wäre nichts, was der Kunde ändern oder beeinflussen könnte.
Daher würde ich sagen, dass man mit sowas if($oUser->save) schon 99% der Probleme abfangen kann.
Hast du aber einen customized Shop mit eigenen indizierten Feldern im oxUser, deren Inhalt ein Insert oder Update verhindern kann, so kann es auch in solchen Fällen zu einer Exception kommen. Da sollte man aber vor dem Speichern eigene Prüfungen implementieren, ob der zu speichrnde Inhalt auch OK ist.
In deinem konkreten Fall würde ich schon dafür sorgen wollen, dass $birtDay im passenden Format ist, weil oxbortdate in der DB ein Datum-Feld ist.
Grundsätzlich stimme ich euch zu: Exceptions fangen und behandeln ist sinnvoll.
Stelle Dir aber auch die Frage, ob der Zustand nach den behandelten Exception so ist, dass man ohne Schwierigkeiten weiterarbeiten kann. Kann der User nicht angelegt oder vollständig angepasst werden, muss das Catch dafür sorgen, dass ein Ersatz passiert. Sonst schlagen möglicherweise folgende Aktionen ebenfalls fehl, weil es keinen passenden User gibt. In diesem Fall kann es sogar sinnvoll sein, die Exception erst ziemlich spät zu fangen, um Folgeaktionen zu umgehen.