Schreiben Sie ein Programm oder eine Funktion mit den folgenden Funktionen:
- Das Programm / die Funktion versucht zunächst, die Zeichenfolge
Hello, world!
in den Standardausgabestream zu schreiben . (Für diese Herausforderung sind keine anderen Ausgabeformen akzeptabel, da der Schwerpunkt eher auf der E / A als auf dem trivialen Verhalten des Programms selbst liegt.) Je nachdem, ob es erfolgreich war:- Wenn die Ausgabe erfolgreich war
Hello, world!
, wird das Programm / die Funktion ohne weiteres Verhalten beendet. - Wenn aufgrund eines Fehlers nicht die richtige Ausgabe erstellt werden konnte, versucht das Programm / die Funktion, die Zeichenfolge
Error writing "Hello, world!"
in den Standardfehlerstrom zu schreiben . (Für die Zwecke dieser Herausforderung benötigen Sie keine Fehlerbehandlung für die Fehlerbehandlung selbst.)
- Wenn die Ausgabe erfolgreich war
Klarstellungen
Ihr Programm / Ihre Funktion wird ohne Eingabe ausgeführt (es sei denn, es ist in einer Sprache geschrieben, für deren Eingabe unbedingt eine Eingabe erforderlich ist. In diesem Fall wird es mit der einfachstmöglichen Eingabe ausgeführt).
Wenn Sie eine Ausgabe erstellen, können Sie auf Wunsch auch eine einzelne nachfolgende neue Zeile erstellen. Dies ist jedoch nicht obligatorisch.
Die Definition von "Fehler beim Schreiben in die Standardausgabe", die Ihr Programm implementiert, muss mindestens die folgenden Fälle als Fehler behandeln:
- Die Standardausgabe ist nicht vorhanden (dh es
stdout
handelt sich um ein geschlossenes Dateihandle, es existiert kein Dateideskriptor 1, oder diese Fälle werden jedoch in die von Ihnen verwendete Sprache und das verwendete Betriebssystem übersetzt). - Standardausgabe bezieht sich auf eine Datei auf einer Festplatte, auf der kein freier Speicherplatz mehr vorhanden ist.
- Standardausgang, der eine Verbindung zu einem anderen Programm herstellt, dessen Verbindungsende bereits geschlossen wurde.
und muss mindestens die folgenden Fälle als Erfolg behandeln (dh keinen Fehler):
- Die Standardausgabe wird an ein Terminal angeschlossen und auf dem
Hello, world!
Bildschirm angezeigt. - Die Standardausgabe stellt eine Verbindung zu einer Datei her und
Hello, world!
wird in die Datei geschrieben.
Sie können die Details auswählen, die als Ausgabefehler gelten, sofern dies mit den oben genannten Regeln übereinstimmt.
- Die Standardausgabe ist nicht vorhanden (dh es
Ihr Programm / Ihre Funktion sollte nicht abstürzen, wenn eine der oben aufgeführten Fehlersituationen auftritt. Es liegt an Ihnen, welchen Exit-Code Sie verwenden.
Ihr Programm / Ihre Funktion sollte nicht die Art des aufgetretenen Fehlers im Standardfehlerstrom beschreiben. Es sollte nur die oben angegebene Zeichenfolge gedruckt werden. Eine externe Ausgabe bei Standardfehlern (z. B. Compiler-Warnungen) ist nur zulässig, wenn sie bedingungslos erzeugt wird, unabhängig davon, ob ein Fehler auftritt oder nicht.
Ihr Programm muss nur auf einem Betriebssystem funktionieren (obwohl es eines sein muss, auf dem die oben aufgeführten Fehler sinnvoll sind; ich habe versucht, sie allgemein genug zu halten, um auf den meisten Multitasking-Consumer-Betriebssystemen zu funktionieren, aber seltsamere Betriebssysteme können es auch sein von dieser Herausforderung ausgeschlossen). Wenn Ihr Programm nicht portierbar ist, listen Sie die Annahmen, die es ausführen muss, im Titel Ihrer Einreichung auf.
Diese Aufgabe ist möglicherweise nicht in jeder Sprache möglich (nicht in jeder Sprache kann ein Programm Ausgabefehler auf benutzerdefinierte Weise behandeln). Sie müssen eine Sprache auswählen, in der dies möglich ist.
Stellen Sie sicher, dass Ihr Programm / Ihre Funktion funktioniert! Vertrauen Sie nicht nur der Dokumentation von Bibliotheksfunktionen, um das zu tun, was sie sagen. Die Fehlerbehandlung einfacher Ausgabefunktionen stellt sich in der Praxis häufig als fehlerhaft heraus, selbst wenn die Funktionen behaupten, Fehler theoretisch zu behandeln.
Testfälle
Hier ist eine Möglichkeit, die oben genannten Fehlerbedingungen unter bash
Linux zu simulieren (Sie müssen Linux nicht verwenden, aber es ist wahrscheinlich das einfachste System, auf dem dies getestet werden kann):
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
Die ersten beiden Testfälle sind deterministisch. Das letzte ist nicht (es hängt von einer Rennbedingung ab); Zu Testzwecken empfehle ich, eine Verzögerung zwischen dem Start Ihres Programms und der tatsächlichen Ausgabe zur Standardausgabe hinzuzufügen, um sicherzustellen, dass die Rennbedingung auf die Weise behoben wird, die den Fehler aufdeckt.
Siegbedingung
Dies ist eine Code-Golf- Herausforderung, also ist kürzer besser. Wie (fast) immer messen wir die Länge des Programms in Bytes.
sleep 1 < test; (sleep 2; your_program_here) > test
?