2009-10-20 4 views
8

Je dois comprendre la documentation des avertissements faux. La façon dont je l'ai lu, ce code:avertissements :: avertir et catégories FATAL en Perl

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

imprime le « blarg » avertissement et mourir depuis que je l'ai demandé tous les avertissements d'être fatale. Cependant, quand je lance le code que je reçois:

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

Peut-Somone me aider à comprendre pourquoi je ne peux pas me mettre en garde à mourir?

+0

Un avertissement suffisamment grave pour être fatal me semble une * erreur *. C'est la différence, les avertissements * ne sont pas * fatals. – pavium

+4

@pavium: il existe une distinction, mais l'option FATAL du pragma warnings est destinée à promouvoir les avertissements aux erreurs. – ysth

Répondre

12

OK. C'est moche. J'ai eu un poste à moitié préparé expliquant cela comme un bug dans warnings, et puis je me suis rendu compte que ce n'est pas, c'est juste vraiment mal la subtilité de la façon warnings fonctionne.

Avertissements commence à rechercher une trame de pile pertinente pour obtenir les bits d'avertissement de l'appelant de l'appelant warnings::warn. L'idée est que vous écrivez un module et vous utilisez warnings::warn ou warnings::warnif dans vos fonctions, et si l'avertissement est imprimé (ou fatal) dépend du paramètre use warnings dans la portée dans le code qui utilise votre module. Il n'y a pas d'option fournie pour commencer à caller(1) au lieu de caller(2), donc l'effet que vous voulez n'est pas possible.

Un exemple de code qui fonctionne (et montre comment cette interface devrait être utilisée par celui qui l'a écrit):

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"; 

Et vous ne pouvez pas vaincre la façon dont il fonctionne en ajoutant simplement un autre niveau de sous-programmes, car il prend les drapeaux du premier appelant qui est dans un paquet différent de l'appelant de warn/warnif/enable/etc.

+0

Vous pourriez envelopper dans un sub inutile. 'sub bail {utiliser les avertissements FATAL => all; sub {avertissements :: warn ('DANGER')} ->()} ' –

+1

@hobbs: vous l'avez. les sous-marins dans le paquet d'avertissements sont destinés aux développeurs de modules, pas comme une sorte de super warn(). – ysth

+0

Ce n'est pas un bug, c'est une fonctionnalité (subtile diabolique que vous dites) . Merci pour l'explication. – lexu

Questions connexes