2011-11-23 16 views
66

मैं त्रुटि का नाम और ट्रेसबैक विवरण को एक चर में सहेजना चाहता हूं। मेरा प्रयास यहाँ है।एक चर में traceback/sys.exc_info() मानों को कैसे सहेजते हैं?

import sys 
try: 
    try: 
     print x 
    except Exception, ex: 
     raise NameError 
except Exception, er: 
    print "0", sys.exc_info()[0] 
    print "1", sys.exc_info()[1] 
    print "2", sys.exc_info()[2] 

आउटपुट:

0 <type 'exceptions.NameError'> 
1 
2 <traceback object at 0xbd5fc8> 

वांछित आउटपुट:

0 NameError 
1 
2 Traceback (most recent call last): 
    File "exception.py", line 6, in <module> 
    raise NameError 

पी.एस. मुझे पता है कि यह ट्रेसबैक मॉड्यूल का उपयोग करके आसानी से किया जा सकता है, लेकिन मैं sys.exc_info() [2] ऑब्जेक्ट का उपयोग जानना चाहता हूं।

+2

आप गलत समझा हो सकता है कि आपके कार्यक्रम में चल रहा है: ट्रैस बैक वस्तु का एक उदाहरण (= आप पहले से ही ट्रैस बैक मॉड्यूल का उपयोग कर रहे है जो आप के रूप में "sys.exc_info() [2] वस्तु" का संदर्भ लें)। अब, आप उस ऑब्जेक्ट को ट्रेसबैक मॉड्यूल में सहायक कार्यों का उपयोग किए बिना कुशल बना सकते हैं, लेकिन यह इस तथ्य को नहीं बदलेगा कि आप अभी भी इसका उपयोग कर रहे हैं। :) – mac

+0

क्या आपने sys.exc_info() [x] .__ str __() प्रिंट करने का प्रयास किया था? – zmbq

+1

तो @mac कृपया इस ऑब्जेक्ट से मूल्य को एक्सेस करने या हेल्पर फ़ंक्शन का उपयोग किए बिना उपयोग करने में मेरी सहायता करें। – codersofthedark

उत्तर

96

यह कैसे मैं यह कर रहा है:

>>> import traceback 
>>> try: 
... int('k') 
... except: 
... var = traceback.format_exc() 
... 
>>> print var 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
ValueError: invalid literal for int() with base 10: 'k' 

आप तथापि, traceback documentation पर एक नज़र के रूप में आप वहाँ अधिक उपयुक्त विधियों का पता लगाने सकता है, आप कैसे बाद में अपने चर पर कार्रवाई करना चाहते हैं निर्भर करता है चाहिए ...

+1

मैं ट्रेसबैक मॉड्यूल का उपयोग किये बिना किसी विधि की तलाश कर रहा था। क्या कोई ऐसा है कि हम इस ऑब्जेक्ट संदर्भ से ट्रेस-बैक विवरण प्रिंट कर सकते हैं? sys.exc_info() [2] – codersofthedark

+0

ठीक है, इसलिए मैंने सोचा कि हम sys.exc_info() [2] .format_exc() जैसे कुछ कर सकते हैं, लेकिन यह काम नहीं करता .. इस प्रकार, मुझे आश्चर्य है कि मैं मूल्य कैसे निकाल सकता हूं ट्रेस-बैक ऑब्जेक्ट sys.exc_info() [2]। कोई उपाय? – codersofthedark

+0

@dragosrsupercool - "यही कारण है कि मैंने सोचा कि हम sys.exc_info() [2] .format_exc()" जैसे कुछ कर सकते हैं जो कोई समझ नहीं आता है। आप ट्रेसबैक मॉड्यूल फ़ंक्शन को कॉल करने का प्रयास कर रहे हैं जैसे कि यह ट्रेसबैक ऑब्जेक्ट का एक तरीका था ... – mac

1

मेरा answer किसी अन्य प्रश्न पर विवरणों को चित्रित करने में मदद कर सकता है - लिंक के साथ! डिब्बाबंद तारों के लिए, मानक लाइब्रेरी ट्रेसबैक मॉड्यूल ठीक लगता है। यदि आप विवरण प्राप्त करना चाहते हैं, तो अधिक जानकारी के लिए स्रोत (<python install path>/Lib/traceback.py) पढ़ें।

12

यदि आप मॉड्यूल और फ़ंक्शन नाम और लाइन नंबरों तक सुविधाजनक पहुंच चाहते हैं तो traceback.extract_stack() का उपयोग करें।

''.join(traceback.format_stack()) का उपयोग करें यदि आप केवल traceback.print_stack() आउटपुट की तरह दिखने वाली स्ट्रिंग चाहते हैं।

ध्यान दें कि ''.join() के साथ भी आपको एक बहु-पंक्ति स्ट्रिंग मिलेगी, क्योंकि format_stack() के तत्व \n हैं। नीचे आउटपुट देखें।

import traceback पर याद रखें।

यहां traceback.extract_stack() से आउटपुट है। स्वरूपण के लिए स्वरूपण जोड़ा गया।

>>> traceback.extract_stack() 
[ 
    ('<string>', 1, '<module>', None), 
    ('C:\\Python\\lib\\idlelib\\run.py', 126, 'main', 'ret = method(*args, **kwargs)'), 
    ('C:\\Python\\lib\\idlelib\\run.py', 353, 'runcode', 'exec(code, self.locals)'), 
    ('<pyshell#1>', 1, '<module>', None) 
] 

यहां ''.join(traceback.format_stack()) से आउटपुट है। स्वरूपण के लिए स्वरूपण जोड़ा गया।

>>> ''.join(traceback.format_stack()) 
' File "<string>", line 1, in <module>\n 
    File "C:\\Python\\lib\\idlelib\\run.py", line 126, in main\n 
     ret = method(*args, **kwargs)\n 
    File "C:\\Python\\lib\\idlelib\\run.py", line 353, in runcode\n 
     exec(code, self.locals)\n File "<pyshell#2>", line 1, in <module>\n' 
10

sys.exc_info() तीन मानों (प्रकार, मान, ट्रेसबैक) के साथ एक टुपल देता है।

  1. यहाँ प्रकार अपवाद के अपवाद के प्रकार संभाला जा रहा हो जाता है
  2. मूल्य तर्क है कि अपवाद वर्ग के निर्माता के लिए पारित किया जा रहा है
  3. ट्रैस बैक की तरह जहां अपवाद घटित आदि ढेर में जानकारी शामिल है

उदाहरण के लिए, निम्न कार्यक्रम में

try: 

    a = 1/0 

except Exception,e: 

    exc_tuple = sys.exc_info() 

अब अगर हम tuple प्रिंट करते हैं तो मान यह होंगे।

  1. exc_tuple [0] मूल्य "ZeroDivisionError" हो जाएगा
  2. exc_tuple [1] मूल्य "पूर्णांक विभाजन या शून्य द्वारा सापेक्ष" हो जाएगा (स्ट्रिंग अपवाद वर्ग के लिए पैरामीटर के रूप में पारित कर दिया)
  3. exc_tuple [2] की रकम होनी चाहिए "(कुछ स्मृति पते) पर ट्रैकबैक वस्तु"

उपरोक्त विवरण भी बस prin द्वारा दिलवाया जा सकता है स्ट्रिंग प्रारूप में अपवाद टिंग करें।

print str(e) 
संबंधित मुद्दे