Si le lancement du programme échoue on imprime un message d'erreur, et on retourne un code d'erreur conventionnel. On pourrait laisser le « handler » extérieur du fils repporter le message, avec le code d'erreur 2, mais on ne saurait plus alors distinguer cette erreur (le fils n'a pas pu exécuter la commande) du cas où la commande a bien été exécutée mais retourne avec le code d'erreur 2.
      
open Sys;;
open Unix;;
open Printf;;

let exec_failed_retcode = 127 (* Le fils n'a pas pu être lancé *);;

let mon_exec cmd args =
  try
    execvp cmd (Array.append [| cmd |] args);
    assert false
  with Unix_error (e_s) ->
    eprintf "Exec failed for command %s: %s %s\n"
      (String.concat " " (cmd :: Array.to_list args)) (error_message es;
    flush Pervasives.stderr;
    exit exec_failed_retcode
Notez que la commande mon_exec tout comme execvp ne retourne jamais. On l'a fait suivre par assert false pour relacher la contrainte de typage (en fait execvp pourrait avec un type de retour non contraint 'a).