2009-10-20 14 views
8

Debo entender la documentación de advertencia incorrecta. La forma en que lo leí, este código:advertencias :: advertir y categorías FATAL en Perl

use warnings; 
use warnings FATAL => 'all'; 
warnings::warn('numeric', 'blarg'); 
print "finished\n"; 

debe imprimir la advertencia 'blarg' y morir ya he pedido a todas las advertencias a ser fatales. Sin embargo, cuando ejecuto el código me sale:

$> /opt/local/bin/perl x.pl 
blarg at x.pl line 3 
finished 

Puede somone ayudar a entender por qué no puedo conseguir advertir a morir?

+0

Una advertencia lo suficientemente grave como para ser fatal suena como un * error * para mí. Esta es la diferencia, las advertencias * no son * fatales. – pavium

+4

@pavium: hay una distinción, pero las advertencias de la opción FATAL de pragma tienen la intención de promover las advertencias a los errores. – ysth

Respuesta

12

Bien. Esto es feo Tenía una publicación medio preparada que explicaba esto como un error en warnings, y luego me di cuenta de que no, es realmente una malvada sutileza en el modo en que funciona warnings.

Las advertencias comienzan a buscar un marco de pila relevante para obtener los bits de advertencia del llamante del llamante de la persona que llama. La idea es que esté escribiendo algún módulo y use warnings::warn o warnings::warnif en sus funciones, y si la advertencia se imprime (o es fatal) depende de la configuración use warnings en el alcance en el código que usa su módulo. No hay ninguna opción para que comience en caller(1) en lugar de caller(2), por lo que el efecto que desea no es posible.

Un ejemplo de código que hace el trabajo (y demuestra cómo se espera que esta interfaz para ser utilizado por quien lo escribió):

package Foo; 
require warnings; 

sub bail { 
    warnings::warnif('numeric', "You fool! You divided by zero!"); 
} 

package main; 
use warnings FATAL => all; 

Foo::bail(); 
print "Will never be reached\n"; 

Y no se puede derrotar a la forma en que funciona con sólo añadir otro nivel de subrutinas, porque toma las banderas de la primera llamada que está en un paquete diferente de la persona que llama de warn/warnif/enable/etc.

+0

Puedes envolverlo en un submarino sin sentido. 'sub fianza {use advertencias FATAL => todas; sub {warnings :: warn ('PELIGRO')} ->()} ' –

+1

@hobbs: lo tienes. los subs en el paquete warnings están destinados a desarrolladores de módulos, no como un tipo de super warn(). – ysth

+0

No es un error, es una característica (la sutil maldad dices) . Gracias por la explicación. – lexu

Cuestiones relacionadas