./2:
Je dirai déjà que ca dépend du programme que tu veux faire:
* application en ligne de commande : genre outil pour toi ?
* ou pour d'autres ?
* les autres sont-il techniquement compétents en informatique ou plutôt des fonctionnels ?
* une application graphique ?
* quelle est la criticité de ton application ? Si une erreur n'est pas détectée, quelles sont les conséquences ? Le programme produit des données incorrectes ? Des données incorrectes sont produite mais il ne le sait pas ? Effacement de données personnelles ? Brêche de sécurité ? Intrusion informatique ? Intrusion humaine ? Un homme se blesse-t-il ? Un homme meurt-il ? Beaucoup d'hommes meurent ? Une guerre nucléaire se déclenche-t-il ?
* est-ce que ton erreur est permanente ? Passagère ?
* etc.
Tout en haut de l'échelle, il faut mettre en place une vrai stratégie de gestion des erreurs, les classer et quoi faire avec ? Ca sous-entend une gestion de tous les codes erreurs.
Tout en base de l'échelle, tu ne gères rien ou presque

Et au milieu bas, tu peux en gérer certains (fopen qui échoue) mais pas d'autres (fprintf qui échoue).
Pour la solution
./3: plutôt qu'un setjmp global, mieux vaut arrêter le programme dans ce cas (abort ou exit). A toi de voir si c'est embêtant ou pas de ne pas fermer proprement les connections, les fichiers, etc.