Auch bei der Objektorientierung vermeide ich selber Throw/Catch, da die meisten Aufrufe durchaus mit einem Bool-Return einen OK-Status zurückgeben können.
Zumal das Fehlerhandling durch diese Methodik die Programmausführung bei häufigen "Fehlern" durchaus verlangsamt.
Hinzu kommt, dass jeder SNDPGMMSG/QMHSNDPM einen Joblog-Eintrag erzeugt. Auch dies ist bei häufigem Vorkommen verlangsamend zumal es zusätzlich unnötige Joblogs (WRAP) produziert.

*PGMBDY ist zwar eine Möglichkeit, da musst du aber sicher sein, dies in der Hauptprozedur durchzuführen. Befindest du dich in einer internen Unter-Procedur, schlägt das auf den Aufrufer des Programmes und nicht den Aufrufer der Prozedur durch. Damit können durchaus mehrere Aufrufebenen übersprungen werden.
Dies gilt auch für Service-Programme, die Aufrufe durchaus verschachteln können.

Eine saubere Schnittstellendefinition incl. Fehleraussage halte ich generell für besser.
Siehe auch SYSERR-Struktur bei API's.

Aber das ist halt alles Geschmackssache;-).