Écrivez un programme ou une fonction avec les fonctionnalités suivantes:
- Le programme / fonction tente d'abord d'écrire la chaîne
Hello, world!
dans le flux de sortie standard. (Aucune autre forme de sortie n'est acceptable pour ce défi, car l'accent est mis sur les E / S plutôt que sur le comportement trivial du programme lui-même.) Selon qu'il a réussi:- S'il a réussi à sortir
Hello, world!
, le programme / fonction se ferme sans autre comportement. - S'il n'a pas produit la sortie correcte en raison d'une erreur, le programme / la fonction tente d'écrire la chaîne
Error writing "Hello, world!"
dans le flux d'erreur standard. (Aux fins de ce défi, vous n'avez pas besoin de la gestion des erreurs pour la gestion des erreurs elle-même.)
- S'il a réussi à sortir
Clarifications
Votre programme / fonction sera exécuté sans entrée (sauf s'il est écrit dans un langage qui nécessite absolument une entrée pour fonctionner, auquel cas il sera exécuté avec l'entrée la plus simple possible).
Lorsque vous produisez une sortie, vous pouvez également produire une seule nouvelle ligne de fin si vous le souhaitez, mais cela n'est pas obligatoire.
La définition de «l'écriture d'erreur sur la sortie standard» que votre programme implémente doit traiter au moins les cas suivants comme des erreurs:
- La sortie standard étant inexistante (c'est-à
stdout
- dire un descripteur de fichier fermé, aucun descripteur de fichier 1 n'existe, ou cependant ces cas se traduisent dans la langue et le système d'exploitation que vous utilisez); - Sortie standard faisant référence à un fichier sur un disque qui n'a plus d'espace libre;
- Sortie standard se connectant à un autre programme, qui a déjà fermé son extrémité de la connexion.
et doit traiter au moins les cas suivants comme un succès (c'est-à-dire pas une erreur):
- La sortie standard se connecte à un terminal et
Hello, world!
s'affiche à l'écran. - La sortie standard se connecte à un fichier et
Hello, world!
est écrite dans le fichier.
Vous pouvez choisir les détails de ce qui compte comme une erreur de sortie, tant qu'il est conforme aux règles ci-dessus.
- La sortie standard étant inexistante (c'est-à
Votre programme / fonction ne doit pas se bloquer lors de la rencontre de l'une des situations d'erreur répertoriées ci-dessus. C'est à vous de choisir le code de sortie que vous utilisez.
Votre programme / fonction ne doit pas décrire la nature de l'erreur rencontrée sur le flux d'erreur standard; il devrait simplement imprimer la chaîne spécifiée ci-dessus. La sortie étrangère sur erreur standard (par exemple les avertissements du compilateur) n'est légale que si elle est produite sans condition, indépendamment du fait qu'une erreur soit rencontrée ou non.
Votre programme ne doit fonctionner que sur un seul système d'exploitation (bien qu'il doit s'agir d'un système sur lequel les erreurs répertoriées ci-dessus ont un sens; j'ai essayé de les garder suffisamment générales pour fonctionner sur la plupart des systèmes d'exploitation grand public multitâche, mais des systèmes d'exploitation plus étranges peuvent bien être exclus de ce défi). Si votre programme n'est pas portable, indiquez les hypothèses qu'il doit exécuter dans le titre de votre soumission.
Cette tâche peut ne pas être possible dans toutes les langues (toutes les langues ne permettent pas à un programme de gérer les erreurs de sortie de manière personnalisée). Vous devrez choisir une langue où cela est possible.
Assurez-vous que votre programme / fonction fonctionne! Ne vous fiez pas seulement à la documentation des fonctions de la bibliothèque pour faire ce qu'ils disent faire. La gestion des erreurs des fonctions de sortie simples s'avère souvent être rompue dans la pratique, même si les fonctions prétendent gérer les erreurs en théorie.
Cas de test
Voici un moyen de simuler chacune des conditions d'erreur ci-dessus en utilisant bash
sous Linux (vous n'avez pas besoin d'utiliser Linux, mais c'est probablement le système le plus simple pour tester cela):
your_program_here >&- # nonexistent stdout
your_program_here > /dev/full # out of disk space
mkfifo test # note: change "test" to a filename that isn't in use
true < test &
your_program_here > test # connecting to a program that doesn't want input
rm test # clean up the FIFO we used earlier
Les deux premiers cas de test sont déterministes. Le dernier n'est pas (il repose sur une condition de course); à des fins de test, je recommande d'ajouter un délai entre le début de votre programme et la sortie réelle à la sortie standard, afin de garantir que la condition de concurrence critique est résolue de la manière qui expose l'erreur.
Condition de victoire
C'est un défi de code-golf , donc plus court est mieux. Comme (presque) toujours, nous mesurons la longueur du programme en octets.
sleep 1 < test; (sleep 2; your_program_here) > test
?