2010-12-12 13 views
19

में पाइथन raise-रेखा न दिखाएं जब मैं अपने पायथन पुस्तकालयों में अपने स्वयं के अपवाद उठाता हूं, तो अपवाद स्टैक स्वयं को स्टैक के अंतिम आइटम के रूप में उठाता है। यह स्पष्ट रूप से एक त्रुटि नहीं है, अवधारणात्मक रूप से सही है, लेकिन उस पर ध्यान केंद्रित करता है जो डिबगिंग के लिए उपयोगी नहीं है जब आप बाहरी रूप से कोड का उपयोग कर रहे हैं, उदाहरण के लिए मॉड्यूल के रूप में।अपवाद स्टैक

क्या इससे बचने के लिए कोई तरीका है और पाइथन को पिछली-से-आखिरी स्टैक आइटम को अंतिम पायथन पुस्तकालयों की तरह दिखाने के लिए मजबूर किया गया है।

+7

संकलित सी कोड से उठाए जाने पर raise रेखा छिपी हुई है (क्योंकि दिखाने के लिए कोई raise रेखा नहीं है)। मानक पुस्तकालयों के पायथन भागों अभी भी एक ट्रेसबैक में उठाए गए बयान दिखाएंगे। –

+0

यदि आप 'raise' है तो अंतिम पंक्ति को बाहर करने के लिए शायद आप 'sys.excepthook' को हैक कर सकते हैं। लेकिन आम तौर पर संभव नहीं है, इसका उपयोग करें। – delnan

+4

आप हमेशा एक उपयोगी अपवाद उठा सकते हैं। –

उत्तर

7

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

यदि आप traceback मॉड्यूल का उपयोग करते हैं, और कस्टम फ़ंक्शन के साथ sys.excepthook को प्रतिस्थापित करते हैं, तो संभवतः ऐसा करना संभव है। लेकिन परिवर्तन करने से पूरे कार्यक्रम के लिए त्रुटि प्रदर्शन प्रभावित होगा, न केवल आपके मॉड्यूल, इसलिए शायद इसकी अनुशंसा नहीं की जाती है।

आप ब्लॉक को निकालने/निकालने में कोड डालने पर भी त्रुटि डाल सकते हैं, फिर त्रुटि को संशोधित कर सकते हैं और इसे फिर से उठा सकते हैं। लेकिन आपका समय शायद अप्रत्याशित त्रुटियों को असंभव बनाने में बिताया गया है, और जो उत्पन्न हो सकता है उनके लिए सूचनात्मक त्रुटि संदेश लिखना बेहतर है।

-1

मैं सुझाव देता हूं कि तर्कों को मान्य करने के लिए अपवाद तंत्र का उपयोग न करें, जैसा कि प्रलोभन है। सशर्त के रूप में अपवादों के साथ कोडिंग यह कहने की तरह है, "डेवलपर के रूप में, मेरे ऐप को क्रैश करें, मैं उन सभी बुरी स्थितियों के बारे में नहीं सोचता जो मेरे प्रदत्त तर्कों का कारण बन सकते हैं। शायद न केवल आपके नियंत्रण से चीजों के अपवादों का उपयोग करना, बल्कि जो भी है ओएस या हार्डवेयर या पायथन भाषा जैसी किसी अन्य चीज़ के नियंत्रण में मुझे अधिक तार्किक लगेगा, मुझे नहीं पता। अभ्यास में हालांकि मैं अपवाद का उपयोग करता हूं क्योंकि आप समाधान के लिए अनुरोध करते हैं।

अपने प्रश्न का उत्तर देने के लिए, यह thusly कोड करने के लिए बस के रूप में सरल है:

class MyObject(object): 
    def saveas(self, filename): 
     if not validate_filename(filename): 
      return False 
     ... 

फोन करने वाले

if not myobject.saveas(filename): report_and_retry() 

शायद कोई अच्छा जवाब नहीं है, बस कुछ सोचने के लिए।

+0

मुझे इसे ऊपर उठाना पड़ा क्योंकि मैं जितना संभव हो उतने अपवादों से परहेज कर रहा हूं और बस अपने कार्यक्रम को इससे निपटने के लिए कह रहा हूं, इस पर कदम उठाएं, समस्या को लॉग करें, और चलना जारी रखें। मैंने हर जगह की तरह अपवाद फेंकने की तुलना में यहां और अधिक डिबगिंग सफलता प्राप्त की है ... मूल रूप से मैं – Tcll

+0

बढ़ाने के बजाय प्रिंट() का उपयोग कर रहा हूं, मैंने अभी भी इसके दूसरी तरफ सोचा है, और संभवतः कारण अधिकांश इस पर डाउनवोट करेंगे (हालांकि मैं अभी भी नहीं कहूंगा, क्योंकि मेरी आखिरी टिप्पणी अभी भी खड़ी है), सबसे अच्छे डेवलपर्स सिर्फ हर गलत उपयोग के मामले में अपवादों को झुका नहीं देते हैं, केवल एक विशेष अपवाद के लिए विशेष मामलों को उठाते हैं ... उपरोक्त दिया गया है अभी भी विशेष मामलों में हो सकता है न कि आपका कोड भी पकड़ लेगा। उदाहरण: फ़ाइल नाम एक स्ट्रिंग का प्रतिनिधित्व करने वाली वस्तु है। – Tcll

4

आप अजगर में अपना अपवाद हुक बना सकते हैं। नीचे कोड का उदाहरण है जिसका मैं उपयोग कर रहा हूं।

import sys 
import traceback 

def exceptionHandler(got_exception_type, got_exception, got_traceback): 
    listing = traceback.format_exception(got_exception_type, got_exception, got_traceback) 
    # Removing the listing of statement raise (raise line). 
    del listing[-2] 
    filelist = ["org.python.pydev"] # avoiding the debuger modules. 
    listing = [ item for item in listing if len([f for f in filelist if f in item]) == 0 ] 
    files = [line for line in listing if line.startswith(" File")] 
    if len(files) == 1: 
     # only one file, remove the header. 
     del listing[0] 
    print>>sys.stderr, "".join(listing) 

और नीचे कुछ पंक्तियां हैं जिन्हें मैंने अपने कस्टम अपवाद कोड में उपयोग किया है।

sys.excepthook = exceptionHandler 
raise Exception("My Custom error message.") 
आप "फ़ाइल नाम" सूची में फ़ाइल नाम या मॉड्यूल नाम जोड़ सकते हैं अगर आप किसी भी अवांछित फ़ाइलों को अनदेखा करना चाहते विधि अपवाद में

। जैसा कि मैंने पाइथन pydev मॉड्यूल को अनदेखा कर दिया है क्योंकि मैं ग्रहण में pydev डीबगर का उपयोग कर रहा हूं।

ऊपर दिए गए उद्देश्य के लिए उपरोक्त मेरे मॉड्यूल में उपयोग किया जाता है। आप इसे अपने मॉड्यूल के लिए संशोधित और उपयोग कर सकते हैं।

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