2010-10-23 8 views
22

मैंने देखा है कि Exception.pm और Error.pm को पर्ल समुदाय में बड़े पैमाने पर उपयोग नहीं किया जाता है। क्या यह अपवाद हैंडलिंग के लिए eval के बड़े पदचिह्न के कारण है?पर्ल में अपवादों को संभालने का सबसे अच्छा तरीका क्या है?

इसके अलावा पर्ल कार्यक्रमों में सामान्य रूप से अपवाद हैंडलिंग के संबंध में बहुत अधिक उदार नीति दिखाई देती है। क्या इसके लिए कोई अनिवार्य कारण है?

किसी भी घटना में पर्ल में अपवाद हैंडलिंग के लिए सबसे अच्छी विधि क्या होगी?

+2

http://stackoverflow.com/questions/503189/is-object-oriented-exception-handling-in-perl-worth-it http://stackoverflow.com/questions/2165161/whats- की शिकार टूटा-अप-अपवाद-इन-पर्ल http://stackoverflow.com/questions/2439966/do-you-use-an-exception-class-in-your-perl-programs-why-or-why-not http://stackoverflow.com/questions/1426501/how-do-i-handle-exceptions-in-a-procedural- भाषा - क्या हमें वास्तव में पर्ल अपवाद हैंडलिंग के बारे में एक और पोस्ट चाहिए? – Ether

+1

मेरा जवाब देखें [क्या कोशिश करें :: टर्ल अभी भी पर्ल 5.14 या बाद में अपवाद हैंडलिंग के लिए अनुशंसित है?] (Http://stackoverflow.com/a/10374265/2766176) –

उत्तर

43

पर्ल समुदाय की सर्वसम्मति यह है कि Try::Tiny अपवाद हैंडलिंग करने का पसंदीदा तरीका है। आपके द्वारा संदर्भित "लेंसेंट पॉलिसी" शायद

  • पर्ल पूरी तरह से ऑब्जेक्ट उन्मुख भाषा नहीं है। (उदाहरण के लिए जावा के विपरीत आप अपवादों से निपटने से बच नहीं सकते हैं।)
  • कई पर्ल डेवलपर्स की पृष्ठभूमि। (सी और शैल में अपवाद तंत्र नहीं हैं।)
  • लोग किस प्रकार के कार्यों को पर्ल का उपयोग करते हैं। (टेक्स्ट मंगिंग के लिए छोटी स्क्रिप्ट और रिपोर्ट जनरेशन जहां अपवाद हैंडलिंग की आवश्यकता नहीं है।)
  • पर्ल में एक (अच्छा) अंतर्निहित अपवाद तंत्र नहीं है।

नोट पिछले आइटम का मतलब है कि आप इस तरह से कोड का एक बहुत देखेंगे:

eval { something() }; 
if ([email protected]) { 
    warn "Oh no! [[email protected]]\n"; 
} 

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

1. सी में setjmp() और longjmp() है, जिसका उपयोग अपवाद हैंडलिंग के बहुत कच्चे रूप के लिए किया जा सकता है।

+2

+1 "इसे आसान बनाने के लिए * आसान * बनाएं " –

+15

और केवल एक सामान्य गलतफहमी को साफ़ करने के लिए जो मूल पोस्टर से पीड़ित हो सकता है या नहीं: 'eval ब्लॉक' * * eval STRING' नहीं है और रनटाइम पर कोड संकलित नहीं करता है। यह सिर्फ एक अपवाद-हैंडलिंग विधि है - एक अजीब नाम और थोड़ा मजाकिया अर्थशास्त्र के साथ 'कोशिश करें'। – hobbs