2009-12-09 8 views
17

मैं एक बड़े पर्ल एप्लिकेशन में काम कर रहा हूं और हर बार 'मर' कहलाता है, तो स्टैक निशान प्राप्त करना चाहता हूं। मुझे Carp module से अवगत है, लेकिन मैं 'कबूल' के साथ 'मर' के हर उदाहरण को खोज/प्रतिस्थापित नहीं करना चाहूंगा। इसके अलावा, मुझे पर्ल मॉड्यूल या पर्ल दुभाषिया में त्रुटियों के लिए पूर्ण स्टैक निशान चाहिए, और स्पष्ट रूप से मैं कार्प का उपयोग करने के लिए उन्हें नहीं बदल सकता।मैं पर्ल एप्लिकेशन में सभी 'मरने के साथ' कबूल 'को कैसे बदल सकता हूं?

तो, क्या रनटाइम पर 'मर' फ़ंक्शन को संशोधित करने का कोई तरीका है ताकि यह 'कबूल' जैसा व्यवहार करे? या, क्या एक पर्ल दुभाषिया सेटिंग है जो 'मरने' से पूर्ण स्टैक निशान फेंक देगी?

उत्तर

32

Devel::SimpleTrace या Carp::Always का उपयोग करें और वे जो भी आप अपने हिस्से पर बिना किसी कड़ी मेहनत के लिए पूछ रहे हैं वह करेंगे। उनके पास वैश्विक प्रभाव है, जिसका अर्थ है कि उन्हें आसानी से कमांडलाइन पर केवल एक रन के लिए जोड़ा जा सकता है। -MDevel::SimpleTrace

+1

बिल्कुल सही! धन्यवाद! –

12

क्या एक __DIE__ संकेत हैंडलर स्थापना के बारे में? कुछ

$SIG{__DIE__} = sub { Carp::confess @_ }; 

आपकी स्क्रिप्ट के शीर्ष पर कुछ? अधिक जानकारी के लिए perlvar %SIG देखें।

+0

'एसआईजी {__ DIE __}' सेट करके मैंने जो मॉड्यूल लिंक किए हैं, हां, एक चुटकी में आप वही काम कर सकते हैं। मॉड्यूल में निकर आउटपुट बनाने के लिए बस थोड़ा अतिरिक्त कोड है :) – hobbs

+0

यह घर से बना त्रुटि प्रसंस्करण के लिए समाधान है। आप जो कुछ भी चाहते हैं वह कर सकते हैं, जैसे फाइल में त्रुटियों को सहेजना या ईमेल द्वारा पोस्ट करना। –

+0

यह उन स्थितियों में से एक है जहां जादू और चमकता है। :) –

0

Error मॉड्यूल Error::Simple वस्तुओं, जो एक पूर्ण स्टैकट्रेस (निर्माता "फ़ाइल पर ... लाइन .." पाठ पार्स करके एक स्टैक ट्रेस बनाता है) को रोकने के लिए सभी die रों परिवर्तित कर देंगे। $Error::ObjectifyCallback वरीयता के साथ त्रुटियों को संभालने के लिए आप एक मनमानी वस्तु (आमतौर पर Error::Simple से उप-वर्गीकृत) का उपयोग कर सकते हैं।

यह विशेष रूप से आसान है यदि आप आमतौर पर अन्य घटनाओं को सिग्नल करने के लिए अन्य प्रकार के अपवादों को फेंक देते हैं, तो आप Error::Simple (या जो भी अन्य वर्ग आप त्रुटियों के लिए उपयोग कर रहे हैं) के लिए हैंडलर जोड़ते हैं और इसे अपने स्टैकट्रैक या प्रदर्शन करते हैं त्रुटि के प्रकार के आधार पर विशेष लॉगिंग।

+1

कभी-कभी 'त्रुटि' किसी और के अपवाद-हैंडलिंग कोड को तोड़ती है और एक छोटी डीबगिंग दुःस्वप्न की ओर ले जाती है :) – hobbs

+0

हां, दुख की बात है। मुझे हाल ही में इसे छोड़ना पड़ा क्योंकि इसे 'साथ' निर्यात करना पसंद है, जो मूस के साथ असंगत है। मैंने ज्यादातर निष्कर्ष निकाला है कि अपवाद बुरा हैं। :) – Ether

2

मैं आमतौर पर केवल कोड की एक बिट में die रों बदलना चाहते हैं, तो मैं __DIE__ हैंडलर स्थानीय बनाना:

{ 
use Carp; 
local $SIG{__DIE__} = \&Carp::confess; 

.... 
} 

विकास टूल को यह काम कर सकते हैं, लेकिन कुछ मॉड्यूल प्राप्त करने के लिए इस के साथ साथ चाल चल काम करने के लिए उनकी विशेषताएं। जब आप उन हैंडलर को ओवरराइड करते हैं, तो वे सुविधाएं अजीब तरीकों से तोड़ सकती हैं। यह एक अच्छा अभ्यास नहीं है, लेकिन कभी-कभी ऐसा होता है।

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

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