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
?