2009-10-20 12 views
8

में चेतावनी और FATAL श्रेणियां मुझे चेतावनी दस्तावेज गलत समझना चाहिए। जिस तरह से मैंने इसे पढ़ा, इस कोड:चेतावनियां :: पर्ल

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

'blarg' चेतावनी मुद्रित और मरने के बाद से मैं सभी चेतावनियों घातक होने के लिए कहा है चाहिए। हालांकि, जब मैं कोड चल रहा मिलती है:

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

somone मदद कर सकते हैं मुझे समझने कारण है कि मैं मरने के लिए चेतावनी दी है नहीं मिल सकता है?

+0

मुझे एक * त्रुटि * की तरह घातक ध्वनि होने के लिए पर्याप्त चेतावनी दी गई है। यह अंतर है, चेतावनियां * घातक नहीं हैं। – pavium

+4

@ पैवियम: एक भेद है, लेकिन चेतावनियां प्रागमा का FATAL विकल्प त्रुटियों को चेतावनियों को बढ़ावा देने के लिए है। – ysth

उत्तर

12

ठीक है। यह बदसूरत है। warnings में warnings में एक बग के रूप में इसे एक आधा तैयार किया गया था, और फिर मुझे एहसास हुआ कि यह वास्तव में बुराwarnings काम करता है।

चेतावनी warnings::warn के कॉलर के कॉलर से चेतावनी बिट प्राप्त करने के लिए प्रासंगिक स्टैक फ्रेम की तलाश शुरू कर देती है। विचार यह है कि आप कुछ मॉड्यूल लिख रहे हैं और आप अपने कार्यों में warnings::warn या warnings::warnif का उपयोग करते हैं, और चेतावनी मुद्रित (या घातक)पर आपके मॉड्यूल का उपयोग करने वाले कोड में use warnings पर निर्भर करता है या नहीं। caller(2) के बजाय caller(1) पर शुरू करने के लिए कोई विकल्प उपलब्ध नहीं है, इसलिए आप जिस प्रभाव को चाहते हैं वह संभव नहीं है।

कोड का एक उदाहरण है कि काम करता है (और दर्शाता है कि कैसे इस इंटरफेस जो कोई भी यह लिखा था द्वारा प्रयोग की जाने की उम्मीद थी):

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

और आप जिस तरह से यह सिर्फ एक और स्तर जोड़ने के द्वारा काम करता है को नहीं हरा सकते subroutines की, क्योंकि यह में warn/warnif/enable/आदि के कॉलर से पहले कॉलर से झंडे लेता है।

+0

आप इसे एक व्यर्थ उप में लपेट सकते हैं। 'उप जमानत {चेतावनियों का उपयोग करें FATAL => सभी; उप {चेतावनियां :: चेतावनी ('डेंजर')} ->()} ' –

+1

@ हॉब्स: आपको यह मिल गया है। चेतावनियों पैकेज में सबस मॉड्यूल डेवलपर्स के लिए है, किसी प्रकार की सुपर चेतावनी() के रूप में नहीं। – ysth

+0

यह एक बग नहीं है, यह एक है (बुराई subtlety आप कहते हैं) सुविधा । स्पष्टीकरण के लिए धन्यवाद। – lexu

संबंधित मुद्दे