Napisz program lub funkcję o następującej funkcjonalności:
- Program / funkcja najpierw próbuje zapisać ciąg
Hello, world!
do standardowego strumienia wyjściowego. (Żadne inne formy wyników nie są akceptowalne dla tego wyzwania, ponieważ nacisk kładziony jest raczej na operacje we / wy, a nie na trywialne zachowanie samego programu.) W zależności od tego, czy się udało:- Jeśli zakończy się powodzeniem
Hello, world!
, program / funkcja kończy działanie bez dalszego działania. - Jeśli nie udało się wygenerować poprawnego wyniku z powodu błędu, program / funkcja próbuje zapisać ciąg znaków
Error writing "Hello, world!"
do standardowego strumienia błędów. (Na potrzeby tego wyzwania nie jest wymagana obsługa błędów dla samej obsługi błędów).
- Jeśli zakończy się powodzeniem
Wyjaśnienia
Twój program / funkcja zostanie uruchomiona bez wprowadzania danych (chyba że jest napisana w języku, który absolutnie wymaga danych wejściowych do działania, w którym to przypadku zostanie uruchomiona z najprostszym możliwym wejściem).
Jeśli produkujesz dane wyjściowe, możesz również utworzyć jeden końcowy znak nowej linii, jeśli chcesz, ale nie jest to obowiązkowe.
Definicja „zapisu błędu na standardowe wyjście”, którą implementuje program, musi traktować co najmniej następujące przypadki jako błędy:
- Standardowe wyjście nie istnieje (tzn.
stdout
Jest zamkniętym uchwytem pliku, nie istnieje żaden deskryptor pliku 1, lub te przypadki tłumaczą się na język i używany system operacyjny); - Standardowe wyjście odnoszące się do pliku na dysku, na którym nie ma już wolnego miejsca;
- Standardowe wyjście podłączane do innego programu, który już zamknął swój koniec połączenia.
i musi traktować co najmniej następujące przypadki jako sukces (tj. nie błąd):
- Standardowe wyjście łączy się z terminalem i
Hello, world!
jest wyświetlane na ekranie. - Standardowe wyjście łączy się z plikiem i
Hello, world!
jest zapisywane w pliku.
Możesz wybrać szczegóły, które liczą się jako błąd wyjściowy, o ile jest to zgodne z powyższymi zasadami.
- Standardowe wyjście nie istnieje (tzn.
Twój program / funkcja nie powinna ulec awarii po napotkaniu którejkolwiek z powyższych sytuacji błędów. Od Ciebie zależy, jakiego kodu wyjścia użyjesz.
Twój program / funkcja nie powinna opisywać charakteru napotkanego błędu w standardowym strumieniu błędów; powinien po prostu wydrukować ciąg określony powyżej. Zewnętrzne dane wyjściowe dotyczące błędu standardowego (np. Ostrzeżenia kompilatora) są legalne tylko wtedy, gdy są generowane bezwarunkowo, niezależnie od tego, czy wystąpi błąd, czy nie.
Twój program musi działać tylko na jednym systemie operacyjnym (chociaż musi to być ten, w którym wymienione wyżej błędy mają sens; starałem się, aby były one wystarczająco ogólne, aby działały na większości wielozadaniowych systemów operacyjnych dla konsumentów, ale dziwniejsze systemy operacyjne mogą być wykluczone z tego wyzwania). Jeśli Twojego programu nie można przenosić, w tytule zgłoszenia podaj założenia, które należy uruchomić.
To zadanie może nie być możliwe w każdym języku (nie każdy język pozwala programowi na obsługę błędów wyjściowych w niestandardowy sposób). Musisz wybrać język, w którym jest to możliwe.
Upewnij się, że Twój program / funkcja działa! Nie ufaj po prostu dokumentacji funkcji bibliotecznych, aby robić to, co mówią. Obsługa błędów w prostych funkcjach wyjściowych często okazuje się być zepsuta w praktyce, nawet jeśli funkcje twierdzą, że obsługują błędy w teorii.
Przypadki testowe
Oto sposób na symulację każdego z powyższych błędów bash
w Linuksie (nie musisz używać Linuksa, ale prawdopodobnie jest to najłatwiejszy system do przetestowania tego):
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
Pierwsze dwie przypadki testowe są deterministyczne. Ostatni nie jest (zależy od warunków wyścigu); do celów testowych zalecam dodanie opóźnienia między uruchomieniem programu a rzeczywistym wyjściem do standardowego wyjścia, aby upewnić się, że warunki wyścigu zostaną rozwiązane w sposób, który ujawnia błąd.
Warunek zwycięstwa
To jest golf-golfwyzwanie, więc krótszy jest lepszy. Jak (prawie) zawsze mierzymy długość programu w bajtach.
sleep 1 < test; (sleep 2; your_program_here) > test
?Odpowiedzi:
Bash ,
7160 bajtówWypróbuj online!
Jak to działa
Po zapisaniu
Hello, world!
do zmiennej h wykonujemy następujące czynności.Najpierw
(echo $h)2>&-
próbuje wydrukowaćHello, world!
do STDOUT.2>&-
jest wymagane, aby zapobiec wyświetlaniu echa komunikatu o błędzie: błąd zapisu: zły deskryptor pliku w przypadku niepowodzenia zapisu. Ponieważ pisanie do nazwanego potoku, który nie przyjmuje danych wejściowych, zabiłoby program Bash z sygnałem 13 (SIGPIPE), wykonujemy polecenie w podpowłoce ((...)
), więc tylko podpowłoka zostanie zabita.Wreszcie, jeśli drukowanie do STDOUT nie powiedzie się, podpowłoka zakończy działanie z niezerowym kodem stanu (141 dla SIGPIPE, 1 dla błędu ogólnego), więc
echo Error writing \"$h\">&2
drukuje żądany komunikat do STDERR.źródło
Python 2 , 65 bajtów
Dwa bajty można zapisać, drukując pojedyncze cytaty.
Wypróbuj online!
źródło
Zsh , 55 bajtów
W przeciwieństwie do swojego kuzyna Basha, Zsh odmawia śmierci z powodu pękniętej rury.
Wypróbuj online!
źródło
C (gcc) ,
8786 bajtówWypróbuj online!
Nie golfił
źródło
puts
zwraca liczbę zapisanych bajtów lub -1 w przypadku błędu, więc zwraca 14 (Hello World plus nowy wiersz) lub -1 . (To może być specyficzne dla platformy, ale tak właśnie działa z glibc.)PowerShell, 80 bajtów
wyjaśnione:
nie udało mi się tego wypróbować, gdy wystąpi błąd, ale zdecydowanie ~ powinno ~ działać.
źródło
Write-Host -ErrorAction Stop
czegoś takiego. Ponadtothrow
produkuje dodatkowe debugowanie informacji poza wierszem, który powinien wydrukować, który, nawiasem mówiąc, powinien mieć małą literę W i podwójne cudzysłowy wokół łańcucha HW.JavaScript,
7976 bajtówźródło
'Hello, world!'
, jest o jeden bajt dłuższy niż to, czego używasz. Przypuszczam też, że przypisaniea
do wywołaniaconsole.log
byłoby krótsze (1B) i usunięcie średnika pol.log(a)
zapisaniu kolejnego bajtu.try{(l=console).log(a="Hello, world!")}catch(e){l.error('Error writing '+a)}
dla 76 bajtów. Najpierwconsole
jest przypisany dol
, następnie"Hello, world!'
przypisany doa
, a następnie wykonany.Perl 5, 51 bajtów
wymaga
-M5.01
, co jest bezpłatneTestowany w Strawberry Perl 5.24.0 przez uruchomienie programu w stanie, w jakim się znajduje (wydruk na standardowe wyjście) i uruchomienie
(wydrukowano do standardowego błędu). Nie wiem, jak testować pod kątem innych błędów przy użyciu Strawberry, ale powinny być obsługiwane tak samo…
źródło
Hello, world!
po,=== 1 ===
a nic po pozostałych. Debugowanie nie powinno wyświetlać nic po=== 1 ===
iError writing "Hello, world!"
po innych. Wiem, że twój program nie musi działać na TIO, aleprint f...
pokazuje zamierzone komunikaty o błędach, podczas gdy oryginalny program nie.REXX,
111106 bajtówProgram polega na istnieniu strumienia zwanego „stderr”. Prawdopodobnie nie będzie tak w przypadku systemów IBM.
źródło
C, 77 bajtów
na wezwanie
źródło
R , 91 bajtów
Wypróbuj online!
Próbowałem go popsuć, uruchamiając go
cat(s,file=12)
zamiastcat(s)
, i wypisuje poprawny tekst na stderr. Winvalid connection
przeciwnym razie jest to błąd.źródło