2013-06-11 6 views
5

यह स्क्रिप्ट:क्यों चेतावनी का उपयोग नहीं करता FATAL => 'all' काम करने लगते हैं?

use warnings FATAL => 'all'; 

warn 'warning'; 
die 'death'; 

... 'चेतावनी' में परिणाम लॉग इन किया जा रहा है, लेकिन, उस बिंदु पर मरता नहीं है बजाय 'मौत' के साथ मरने।

मेरे पास एक mod_perl मॉड्यूल है जो विकास के दौरान ब्राउज़र में मरने() संदेशों को मूल रूप से थूकने के लिए $main::SIG{__DIE__} ओवरराइड करता है, लेकिन यह SIG{__WARN__} को स्पर्श नहीं करता है, तो यहां क्या हो रहा है?

यह पर्लस्विच में "-w" के साथ विंडोज सर्वर 2003 पर perl 5.10.1 पर है।

उत्तर

8

आपने warnings pragma के उद्देश्य को गलत समझा। पूरी तरह से कानूनी, लेकिन संभवतः गलत संचालन के लिए एक चेतावनी संदेश उत्सर्जित करना है। उदाहरण:

use warnings; 
my ($x, $y) = ("hello", "world"); 
say "same" if $x == $y; 

Argument "world" isn't numeric…। हम कुछ श्रेणियां use warnings FATAL => $CATEGORY के साथ numeric या uninitialized जैसी श्रेणियों के साथ घातक त्रुटियों का उत्पादन कर सकते हैं। all श्रेणी सभी श्रेणियों का प्रतिनिधित्व करता है।

यह प्रत्येक warn से die के अर्थशास्त्र को बदलता है। आप इसे स्वयं कर सकते हैं, उदा। local $SIG{__WARN__} को ओवरराइड करने के साथ, या फ़ंक्शन बनाना जो croak @_ करता है। आप सभी warn एस को बदलने के लिए CORE::GLOBAL::warn को ओवरराइड भी कर सकते हैं, भले ही वे अन्य मॉड्यूल में हों।

CGI::Carp मॉड्यूल में warningsToBrowser विकल्प है; आप यह देखने के लिए स्रोत कोड देखना चाहते हैं कि यह कैसे कार्यान्वित किया गया है।

9

यह काम करने के लिए प्रतीत नहीं होता है क्योंकि आपका परीक्षण परीक्षण नहीं कर रहा है कि आप परीक्षण करना चाहते हैं। इस प्रयास करें: बस एक no warnings रूप

use warnings FATAL => 'all'; 

print undef; 
die 'death'; 

काम करने से warn पर रोक नहीं लगेगी, warnings FATALwarn मरने नहीं होगा।

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