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
?Antworten:
Bash ,
7160 BytesProbieren Sie es online aus!
Wie es funktioniert
Nach dem Speichern
Hello, world!
in der Variablen h gehen wir wie folgt vor.Erstens,
(echo $h)2>&-
zu drucken versuchtHello, world!
zu STDOUT.2>&-
ist erforderlich, um zu verhindern, dass die Fehlermeldung echo angezeigt wird: Schreibfehler: Ungültiger Dateideskriptor, falls der Schreibvorgang fehlschlägt. Da das Schreiben in eine Named Pipe, die keine Eingaben akzeptiert, das Bash-Programm mit Signal 13 (SIGPIPE) beenden würde, führen wir den Befehl in einer Subshell ((...)
) aus, sodass nur die Subshell beendet wird.Wenn das Drucken nach STDOUT fehlgeschlagen ist, wird die Unterschale mit einem Statuscode ungleich Null beendet (141 für SIGPIPE, 1 für einen generischen Fehler), sodass
echo Error writing \"$h\">&2
die gewünschte Nachricht an STDERR gedruckt wird.quelle
Python 2 , 65 Bytes
Durch Drucken von einfachen Anführungszeichen können zwei Bytes gespeichert werden.
Probieren Sie es online aus!
quelle
Zsh , 55 Bytes
Im Gegensatz zu seinem Cousin Bash weigert sich Zsh, wegen eines Rohrbruchs zu sterben.
Probieren Sie es online aus!
quelle
C (gcc) ,
8786 BytesProbieren Sie es online aus!
Ungolfed
quelle
puts
Gibt die Anzahl der geschriebenen Bytes oder -1 im Fehlerfall zurück, sodass entweder 14 (Hello World plus Newline) oder -1 zurückgegeben wird . (Das mag plattformspezifisch sein, aber so verhält es sich mit glibc.)PowerShell, 80 Byte
erklärt:
Ich habe es nicht geschafft, dies tatsächlich zu versuchen, wenn es fehlerhaft ist, aber es sollte definitiv funktionieren.
quelle
Write-Host -ErrorAction Stop
oder so etwas. Außerdemthrow
erzeugt das neben der zu druckenden Zeile eine zusätzliche Debugging-Information, die übrigens ein W in Kleinbuchstaben und doppelte Anführungszeichen um die HW-Zeichenfolge haben sollte.Javascript,
7976 Bytesquelle
'Hello, world!'
, ein Byte länger ist als die von Ihnen verwendete. Außerdem würde die Zuweisunga
innerhalb des Aufrufsconsole.log
kürzer sein (1B) und das Entfernen des Semikolons nach deml.log(a)
Speichern eines weiteren Bytes.try{(l=console).log(a="Hello, world!")}catch(e){l.error('Error writing '+a)}
für 76 Bytes. Zuerstconsole
wird zugewiesenl
, dann"Hello, world!'
wird zugewiesena
und dann wird es ausgeführt.Perl 5, 51 Bytes
erfordert
-M5.01
, was kostenlos istGetestet in Strawberry Perl 5.24.0 durch Ausführen des Programms wie es ist (gedruckt auf Standardausgabe) und durch Ausführen
(auf Standardfehler gedruckt). Ich weiß nicht, wie ich mit Strawberry auf andere Fehler testen soll, aber sie sollten gleich behandelt werden.
quelle
Hello, world!
nach=== 1 ===
und nichts nach den anderen angezeigt werden . Das Debuggen sollte nach=== 1 ===
undError writing "Hello, world!"
nach den anderen nichts anzeigen . Ich bin mir bewusst, dass Ihr Programm nicht mit TIO arbeiten muss, sondernprint f...
die beabsichtigten Fehlermeldungen anzeigt, während das ursprüngliche Programm dies nicht tut.REXX,
111106 BytesDas Programm setzt voraus, dass es einen Stream namens 'stderr' gibt. Dies wird auf IBM-Systemen wahrscheinlich nicht der Fall sein.
quelle
C 77 Bytes
für einen Anruf
quelle
R 91 Bytes
Probieren Sie es online aus!
Ich habe versucht, es zu korrigieren, indem ich es mit
cat(s,file=12)
anstelle von ausgeführt habecat(s)
, und es gibt den richtigen Text an stderr aus. Dies istinvalid connection
ansonsten ein Fehler.quelle