Tulis program atau fungsi dengan fungsi berikut:
- Program / fungsi pertama kali mencoba menulis string
Hello, world!
ke aliran output standar. (Tidak ada bentuk output lain yang dapat diterima untuk tantangan ini, karena fokusnya sangat banyak pada I / O daripada perilaku sepele dari program itu sendiri.) Tergantung pada apakah itu berhasil:- Jika berhasil menghasilkan
Hello, world!
, program / fungsi keluar tanpa perilaku lebih lanjut. - Jika gagal menghasilkan output yang benar karena kesalahan, program / fungsi mencoba untuk menulis string
Error writing "Hello, world!"
ke aliran kesalahan standar. (Untuk keperluan tantangan ini, Anda tidak perlu menangani kesalahan untuk penanganan kesalahan itu sendiri.)
- Jika berhasil menghasilkan
Klarifikasi
Program / fungsi Anda akan dijalankan tanpa input (kecuali jika ditulis dalam bahasa yang benar-benar membutuhkan input untuk bekerja, dalam hal ini akan dijalankan dengan input sesederhana mungkin).
Saat menghasilkan output, Anda juga dapat menghasilkan satu baris baru jika diinginkan, tetapi melakukannya tidak wajib.
Definisi "penulisan kesalahan ke output standar" yang diterapkan oleh program Anda harus memperlakukan setidaknya kasus-kasus berikut sebagai kesalahan:
- Output standar tidak ada (yaitu
stdout
filehandle tertutup, tidak ada deskriptor file 1 ada, atau bagaimanapun kasus-kasus menerjemahkan ke bahasa dan OS yang Anda gunakan); - Output standar mengacu pada file pada disk yang tidak memiliki ruang kosong tersisa;
- Output standar yang terhubung ke program lain, yang sudah menutup ujung koneksi.
dan harus memperlakukan setidaknya kasus-kasus berikut sebagai keberhasilan (yaitu bukan kesalahan):
- Output standar terhubung ke terminal, dan
Hello, world!
ditampilkan di layar. - Output standar terhubung ke file, dan
Hello, world!
ditulis ke dalam file.
Anda dapat memilih detail dari apa yang dianggap sebagai kesalahan output, asalkan konsisten dengan aturan di atas.
- Output standar tidak ada (yaitu
Program / fungsi Anda seharusnya tidak macet saat menemukan salah satu situasi kesalahan yang tercantum di atas. Terserah Anda apa kode keluar yang Anda gunakan.
Program / fungsi Anda tidak boleh menggambarkan sifat kesalahan yang ditemui pada aliran kesalahan standar; seharusnya hanya mencetak string yang ditentukan di atas. Keluaran luar pada kesalahan standar (mis. Peringatan kompiler) hanya sah jika diproduksi tanpa syarat, terlepas dari apakah ada kesalahan atau tidak.
Program Anda hanya perlu bekerja pada satu sistem operasi (walaupun harus salah satu di mana kesalahan yang tercantum di atas masuk akal; Saya sudah mencoba membuatnya cukup umum untuk bekerja pada sebagian besar sistem operasi konsumen multitasking, tetapi sistem operasi yang lebih aneh mungkin juga dikecualikan dari tantangan ini). Jika program Anda tidak dapat diakses, daftarkan asumsi yang diperlukan untuk menjalankannya dalam judul kiriman Anda.
Tugas ini mungkin tidak dapat dilakukan di setiap bahasa (tidak semua bahasa memungkinkan program menangani kesalahan keluaran dengan cara khusus). Anda harus memilih bahasa yang memungkinkan.
Pastikan program / fungsi Anda berfungsi! Jangan hanya mempercayai dokumentasi fungsi perpustakaan untuk melakukan apa yang mereka katakan. Penanganan kesalahan fungsi output sederhana sering ternyata rusak dalam praktik, bahkan jika fungsi mengklaim untuk menangani kesalahan dalam teori.
Uji kasus
Berikut adalah cara untuk mensimulasikan masing-masing kondisi kesalahan di atas menggunakan bash
di Linux (Anda tidak harus menggunakan Linux, tetapi kemungkinan sistem yang paling mudah untuk menguji ini):
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
Dua testcases pertama bersifat deterministik. Yang terakhir bukan (itu bergantung pada kondisi balapan); untuk tujuan pengujian, saya sarankan untuk menambahkan penundaan antara awal program Anda dan output aktual ke output standar, untuk memastikan bahwa kondisi balapan diselesaikan dengan cara yang mengekspos kesalahan.
Kondisi kemenangan
Ini adalah tantangan kode-golf , jadi lebih pendek lebih baik. Seperti (hampir) selalu, kami mengukur panjang program dalam byte.
sleep 1 < test; (sleep 2; your_program_here) > test
?Jawaban:
Bash ,
7160 byteCobalah online!
Bagaimana itu bekerja
Setelah menyimpan
Hello, world!
ke variabel h , kami melakukan hal berikut.Pertama,
(echo $h)2>&-
mencoba mencetakHello, world!
ke STDOUT.2>&-
diperlukan untuk mencegah menampilkan pesan kesalahan echo: write error: deskriptor file salah jika penulisan gagal. Karena menulis ke pipa bernama yang tidak menerima input akan mematikan program Bash dengan sinyal 13 (SIGPIPE), kami menjalankan perintah dalam subshell ((...)
), jadi hanya subshell yang akan terbunuh.Akhirnya, jika pencetakan ke STDOUT gagal, subkulit akan keluar dengan kode status non-nol (141 untuk SIGPIPE, 1 untuk kesalahan umum), jadi
echo Error writing \"$h\">&2
cetak pesan yang diinginkan ke STDERR.sumber
Python 2 , 65 byte
Dua byte dapat disimpan dengan mencetak tanda kutip tunggal.
Cobalah online!
sumber
Zsh , 55 byte
Tidak seperti Bash, sepupunya, Zsh menolak untuk mati karena pipa yang rusak.
Cobalah online!
sumber
C (gcc) ,
8786 byteCobalah online!
Tidak disatukan
sumber
puts
mengembalikan jumlah byte yang telah ditulis atau -1 jika terjadi kesalahan, sehingga mengembalikan 14 (Hello World plus newline) atau -1 . (Itu mungkin khusus untuk platform, tetapi ini adalah bagaimana berperilaku dengan glibc.)PowerShell, 80 Bytes
menjelaskan:
belum berhasil untuk benar-benar mencoba ini ketika kesalahan, tetapi pasti ~ harus ~ bekerja.
sumber
Write-Host -ErrorAction Stop
atau sesuatu seperti itu. Juga,throw
menghasilkan tambahan debugging selain dari garis yang harus dicetak, yang omong-omong harus memiliki huruf kecil W dan tanda kutip ganda di sekitar string HW.Javascript,
7976 bytesumber
'Hello, world!'
, yang satu byte lebih panjang dari apa yang Anda gunakan. Juga, saya kira menetapkana
di dalam panggilanconsole.log
akan lebih pendek (1B) dan menghapus titik koma setelahl.log(a)
menyimpan byte lain.try{(l=console).log(a="Hello, world!")}catch(e){l.error('Error writing '+a)}
untuk 76 byte. Pertama,console
ditugaskanl
, kemudian"Hello, world!'
ditugaskana
, dan kemudian dieksekusi.Perl 5, 51 byte
membutuhkan
-M5.01
, yang gratisDiuji dalam Strawberry Perl 5.24.0 dengan menjalankan program apa adanya (dicetak ke output standar) dan dengan menjalankan
(dicetak ke kesalahan standar). Saya tidak tahu bagaimana cara menguji kesalahan lain menggunakan Strawberry, tetapi mereka harus ditangani sama ....
sumber
Hello, world!
setelah=== 1 ===
dan tidak ada setelah yang lain. Debug seharusnya tidak menampilkan apa pun setelah=== 1 ===
danError writing "Hello, world!"
sesudah yang lain. Saya sadar bahwa program Anda tidak harus bekerja pada TIO, tetapiprint f...
menunjukkan pesan kesalahan yang dimaksud sementara program aslinya tidak.REXX,
111106 byteProgram ini mengandalkan aliran yang disebut 'stderr'. Ini mungkin tidak akan terjadi pada sistem IBM.
sumber
C, 77 byte
untuk panggilan
sumber
R , 91 byte
Cobalah online!
Saya mencoba membuat kesalahan dengan menjalankannya dengan
cat(s,file=12)
alih - alihcat(s)
, dan mencetak teks yang benar ke stderr. Jika tidak, ini merupakaninvalid connection
kesalahan.sumber