Escriba un programa o función con la siguiente funcionalidad:
- El programa / función primero intenta escribir la cadena
Hello, world!
en la secuencia de salida estándar. (No se aceptan otras formas de salida para este desafío, ya que el enfoque se centra principalmente en la E / S y no en el comportamiento trivial del programa en sí mismo). Dependiendo de si tuvo éxito:- Si tuvo éxito en la salida
Hello, world!
, el programa / función se cierra sin ningún comportamiento adicional. - Si no pudo producir la salida correcta debido a un error, el programa / función intenta escribir la cadena
Error writing "Hello, world!"
en la secuencia de error estándar. (Para los propósitos de este desafío, no necesita manejo de errores para el manejo de errores en sí).
- Si tuvo éxito en la salida
Aclaraciones
Su programa / función se ejecutará sin entrada (a menos que esté escrito en un lenguaje que requiera absolutamente entrada para funcionar, en cuyo caso se ejecutará con la entrada más simple posible).
Al producir resultados, también puede producir una nueva línea final si lo desea, pero hacerlo no es obligatorio.
La definición de "error al escribir en la salida estándar" que implementa su programa debe tratar al menos los siguientes casos como errores:
- La salida estándar no
stdout
existe ( es decir, es un identificador de archivo cerrado, no existe un descriptor de archivo 1 o, sin embargo, esos casos se traducen al idioma y al sistema operativo que está utilizando); - Salida estándar que se refiere a un archivo en un disco que no tiene espacio libre restante;
- Salida estándar que se conecta a otro programa, que ya ha cerrado su final de la conexión.
y debe tratar al menos los siguientes casos como exitosos (es decir, no como un error):
- La salida estándar se conecta a un terminal y
Hello, world!
se muestra en la pantalla. - La salida estándar se conecta a un archivo y
Hello, world!
se escribe en el archivo.
Puede elegir los detalles de lo que cuenta como un error de salida, siempre que sea coherente con las reglas anteriores.
- La salida estándar no
Su programa / función no debe bloquearse al encontrar cualquiera de las situaciones de error enumeradas anteriormente. Depende de usted qué código de salida usa.
Su programa / función no debe describir la naturaleza del error encontrado en la secuencia de error estándar; solo debe imprimir la cadena especificada anteriormente. El resultado extraño en un error estándar (p. Ej., Advertencias del compilador) solo es legal si se produce incondicionalmente, independientemente de si se encuentra un error o no.
Su programa solo necesita funcionar en un sistema operativo (aunque debe ser uno en el que los errores enumerados anteriormente tengan sentido; he tratado de mantenerlos lo suficientemente generales como para funcionar en la mayoría de los sistemas operativos de consumo multitarea, pero los sistemas operativos más extraños pueden ser excluidos de este desafío). Si su programa no es portátil, enumere las suposiciones que necesita ejecutar en el título de su envío.
Es posible que esta tarea no sea posible en todos los idiomas (no todos los idiomas permiten que un programa maneje errores de salida de forma personalizada). Tendrás que elegir un idioma donde sea posible.
¡Asegúrese de que su programa / función funcione! No solo confíe en la documentación de las funciones de la biblioteca para hacer lo que dicen que hacen. El manejo de errores de funciones de salida simples a menudo se rompe en la práctica, incluso si las funciones afirman manejar errores en teoría.
Casos de prueba
Aquí hay una manera de simular cada una de las condiciones de error anteriores usando bash
Linux (no es necesario que use Linux, pero es probable que sea el sistema más fácil para probar esto):
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
Los dos primeros casos de prueba son deterministas. El último no es (se basa en una condición de carrera); Para fines de prueba, recomiendo agregar un retraso entre el inicio de su programa y la salida real a la salida estándar, para garantizar que la condición de carrera se resuelva de la manera que expone el error.
Condición de victoria
Este es un desafío de código de golf , por lo que más corto es mejor. Como (casi) siempre, estamos midiendo la longitud del programa en bytes.
sleep 1 < test; (sleep 2; your_program_here) > test
?Respuestas:
Bash ,
7160 bytesPruébalo en línea!
Cómo funciona
Después de guardar
Hello, world!
en la variable h , hacemos lo siguiente.Primero,
(echo $h)2>&-
intenta imprimirHello, world!
en STDOUT.2>&-
es necesario para evitar mostrar el mensaje de error echo: error de escritura: descriptor de archivo incorrecto en caso de que falle la escritura. Dado que escribir en una tubería con nombre que no acepta entrada mataría al programa Bash con la señal 13 (SIGPIPE), ejecutamos el comando en una subshell ((...)
), por lo que solo se matará la subshell.Finalmente, si la impresión en STDOUT falló, la subshell saldrá con un código de estado distinto de cero (141 para SIGPIPE, 1 para un error genérico), por lo que
echo Error writing \"$h\">&2
imprime el mensaje deseado en STDERR.fuente
Python 2 , 65 bytes
Se pueden guardar dos bytes imprimiendo comillas simples.
Pruébalo en línea!
fuente
Zsh , 55 bytes
A diferencia de su primo Bash, Zsh se niega a morir debido a una tubería rota.
Pruébalo en línea!
fuente
C (gcc) ,
8786 bytesPruébalo en línea!
Sin golf
fuente
puts
devuelve el número de bytes que se han escrito o -1 en caso de error, por lo que devuelve 14 (Hello World más nueva línea) o -1 . (Eso puede ser específico de la plataforma, pero así es como se comporta con glibc.)PowerShell, 80 bytes
explicado:
no he logrado probar esto cuando falla, pero definitivamente ~ debería ~ funcionar.
fuente
Write-Host -ErrorAction Stop
o algo así. Además,throw
produce una información de depuración adicional aparte de la línea que debe imprimir, que por cierto debe tener una W minúscula y comillas dobles alrededor de la cadena HW.Javascript,
7976 bytesfuente
'Hello, world!'
, que es un byte más larga que la que usa. Además, supongo que asignara
dentro de la llamada aconsole.log
sería más corto (1B) y eliminar el punto y coma después del.log(a)
guardar otro byte.try{(l=console).log(a="Hello, world!")}catch(e){l.error('Error writing '+a)}
por 76 bytes. Primero,console
se asigna al
, luego"Hello, world!'
se asigna aa
, y luego se ejecuta.Perl 5, 51 bytes
requiere
-M5.01
, que es gratisProbado en Strawberry Perl 5.24.0 ejecutando el programa tal cual (impreso en la salida estándar) y ejecutando
(impreso al error estándar). No sé cómo probar otros errores usando Strawberry, pero deberían manejarse de la misma manera ...
fuente
Hello, world!
después=== 1 ===
y nada después de los demás. La depuración no debe mostrar nada después=== 1 ===
yError writing "Hello, world!"
después de los demás. Soy consciente de que su programa no tiene que funcionar en TIO, peroprint f...
muestra los mensajes de error previstos mientras que el programa original no lo hace.REXX,
111106 bytesEl programa se basa en que haya una secuencia llamada 'stderr'. Este probablemente no será el caso en los sistemas IBM.
fuente
C, 77 bytes
para llamar
fuente
R , 91 bytes
Pruébalo en línea!
Intenté equivocarlo ejecutándolo con en
cat(s,file=12)
lugar decat(s)
, e imprime el texto correcto en stderr. Esto es uninvalid connection
error de lo contrario.fuente