Напишіть програму або функцію з такою функціональністю:
- Програма / функція спочатку намагається записати рядок
Hello, world!
у стандартний вихідний потік. (Жодна інша форма виводу не є прийнятною для цього виклику, оскільки в основному фокус робиться на введення-виведення, а не на тривіальну поведінку самої програми.) Залежно від того, чи вдалось це зробити:- Якщо це вдалося вивести
Hello, world!
, програма / функція завершується без подальшої поведінки. - Якщо не вдалося створити правильний висновок через помилку, програма / функція намагається записати рядок
Error writing "Hello, world!"
у стандартний потік помилок. (Для цілей цього виклику вам не потрібно обробляти помилки для самої обробки помилок.)
- Якщо це вдалося вивести
Роз'яснення
Ваша програма / функція буде запускатися без вводу (якщо тільки вона написана мовою, яка абсолютно не потребує введення для роботи; в такому випадку вона буде працювати з найпростішим можливим введенням).
Виробляючи вихід, ви можете також створити один зворотний новий рядок, якщо бажаєте, але це не обов'язково.
Визначення "помилки запису до стандартного виводу", яке реалізує ваша програма, повинно розглянути як мінімум такі випадки як помилки:
- Стандартний вихід не існує (тобто
stdout
закритий файл файлів, дескриптор файлу 1 не існує, але ці випадки перекладаються на мову та ОС, які ви використовуєте); - Стандартний вихід, що стосується файлу на диску, у якому не залишилося вільного місця;
- Стандартний вихід, що підключається до іншої програми, яка вже закрила свій кінець з'єднання.
і має сприймати принаймні такі випадки як успіх (тобто не помилка):
- Стандартний вихід підключається до терміналу і
Hello, world!
відображається на екрані. - Стандартний вихід підключається до файлу і
Hello, world!
записується у файл.
Ви можете вибрати деталі того, що вважається помилкою виводу, якщо це відповідає вищевказаним правилам.
- Стандартний вихід не існує (тобто
Ваша програма / функція не повинна виходити з ладу при зіткненні з будь-якою з перелічених вище ситуацій з помилками. Ви вирішуєте, яким кодом виходу користуєтесь.
Ваша програма / функція не повинна описувати характер виниклої помилки у стандартному потоці помилок; він повинен просто надрукувати рядок, зазначений вище. Стороннє виведення стандартної помилки (наприклад, попередження компілятора) є законним лише тоді, коли воно виробляється беззастережно, незалежно від того, виникає помилка чи ні.
Вашій програмі потрібно працювати лише в одній операційній системі (хоча вона повинна бути такою, на якій помилки, перераховані вище, мають сенс; я намагався тримати їх достатньо загальними для роботи на більшості багатозадачних операційних систем споживачів, але, більш дивні операційні системи цілком можуть бути виключено з цього виклику). Якщо ваша програма нерепортажна, перелічіть припущення, які вона потребує для виконання, у назві вашої заявки.
Це завдання може бути неможливим на всіх мовах (не кожна мова дозволяє програмі обробляти помилки виводу у користувальницький спосіб). Вам доведеться вибрати мову там, де це можливо.
Переконайтесь, що ваша програма / функція працює! Не просто довіряйте документації функцій бібліотеки, щоб робити те, що вони говорять. Поводження з помилками простих вихідних функцій часто виявляється порушеним на практиці, навіть якщо функції теоретично обробляють помилки.
Тестові справи
Ось спосіб імітувати кожне з вищезазначених умов помилок при використанні bash
в Linux (вам не потрібно використовувати Linux, але це, мабуть, найпростіша система для перевірки цього):
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
Перші дві тестові шкали детерміновані. Останнє не (воно покладається на умову перегонів); з метою тестування рекомендую додати затримку між початком вашої програми та фактичним результатом до стандартного виводу, щоб забезпечити вирішення стану гонки таким чином, що викриває помилку.
Стан перемоги
Це код-гольфвиклик, тим коротше - краще. Як (майже) завжди, ми вимірюємо довжину програми в байтах.
sleep 1 < test; (sleep 2; your_program_here) > test
?