2009-03-19 23 views
14

¿Ruby le permite tratar advertencias como errores?¿Puedes pedirle a ruby ​​que trate las advertencias como errores?

Una de las razones por las que me gustaría hacer esto es asegurarme de que si eludir la eliminación de una línea de código significa que se produce una advertencia, tengo la opción de garantizar que el mutante muera.

+0

Presenté una solicitud de función para un indicador de línea de comando para advertir excepciones ... http://redmine.ruby-lang.org/issues/show/3916 –

+0

The Doctor What's RFE obtuvo una respuesta notando esa configuración $ DEBUG = verdadero hace que "demasiados argumentos para la cadena de formato" pasen de ser una advertencia a una Excepción. –

+0

@TheDoctorQué su enlace está desactualizado. Nuevo enlace: https://bugs.ruby-lang.org/issues/3916 –

Respuesta

29

Desafortunadamente no hay forma real de hacerlo, al menos no en la mayoría de las versiones de Ruby por ahí (variaciones puede existir), cortos de seguimiento de la salida del programa y abortarlo cuando aparezca una advertencia en caso de error estándar . He aquí por qué:

  • Rubí define Kernel.warn, que puede redefinir para hacer lo que desee (incluyendo la salida), y que se había esperan (esperanza) para ser utilizado constantemente por Ruby a reportar advertencias (incluyendo por ejemplo, la advertencia de análisis sintáctico interno), pero
  • métodos implementados de forma nativa (en C) en el interior de Ruby a su vez invocar directamente un método nativo llamado rb_warn de source/server.c, completamente omitiendo su redefinición de Kernel.warn (p. Ej. la advertencia "string literal in condition", por ejemplo, emite cuando haciendo algo como: do_something if 'string', se imprime a través de la nativa rb_warn de source/parse.c)
  • para hacer las cosas aún peor, hay una, rb_warning método nativo adicional, que puede ser utilizado por Rubí para registrar advertencias si se especifica -w o -v.

Por lo tanto, si usted necesita tomar acción únicamente en avisos generados por su código de aplicación que llama Kernel.warn continuación simplemente redefinir Kernel.warn. De lo contrario, usted tiene exactamente dos opciones:

  1. alteran source/error.c para salir en rb_warn y rb_warning y reconstruir Rubí
  2. controlar la salida de error estándar de su programa de ': warning:', y abortar en (y rb_warn_m?) partido
+4

Gracias. ¡Una respuesta autorizada si alguna vez la vi! –

+0

Para supervisar la salida de error estándar de su programa para ": advertencia:", http://stackoverflow.com/a/32941696/18096 podría ser útil. –

1

también podría usar potencialmente DTrace, e interceptar las llamadas a rb_warn y rb_warning, aunque eso no va a producir excepciones se puede rescatar de alguna parte. Más bien, simplemente los colocará en algún lugar donde pueda registrarlos fácilmente.

Cuestiones relacionadas