2013-01-25 12 views
31

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

यह पता लगाना बहुत मुश्किल है कि समस्या में कोड किस स्थान पर हुआ था। अगर मुझे पता था कि त्रुटि किस पंक्ति में उठाई गई थी, तो इससे बहुत मदद मिलेगी। यदि मैं निम्नलिखित कोड का उपयोग करता हूं:

try: 
    result = evaluateData(data) 
except Exception, err: 
    print ("Error: %s.\n" % str(err)) 

दुर्भाग्यवश यह केवल मुझे बताता है कि वहां और अनुक्रमणिका त्रुटि है। क्या हुआ यह पता लगाने के लिए मैं अपवाद (कोड, चर आदि में रेखा) के बारे में अधिक जानकारी जानना चाहता हूं। क्या यह संभव है?

धन्यवाद।

+1

देखें http://stackoverflow.com/questions/3702675/प्रिंट-पूर्ण ट्रैस बैक-इन-अजगर-बिना-हॉल्टिंग-कार्यक्रम! –

+0

https://docs.python.org/2/library/traceback.html#traceback-examples – osa

+2

@JeCh उत्तर अच्छे लगते हैं। कृपया एक स्वीकार करें। इसे स्वीकार करने के लिए उत्तर के बगल में खाली चेकमार्क पर क्लिक करें। –

उत्तर

16

लाइन नंबर प्राप्त करने के लिए आप sys का उपयोग कर सकते हैं, यदि आप और अधिक चाहते हैं, तो traceback मॉड्यूल का प्रयास करें।

import sys  
try: 
    [][2] 
except IndexError: 
    print 'Error on line {}'.format(sys.exc_info()[-1].tb_lineno) 

प्रिंट:

Error on line 3 

Example from the traceback module documentation:

import sys, traceback 

def lumberjack(): 
    bright_side_of_death() 

def bright_side_of_death(): 
    return tuple()[0] 

try: 
    lumberjack() 
except IndexError: 
    exc_type, exc_value, exc_traceback = sys.exc_info() 
    print "*** print_tb:" 
    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout) 
    print "*** print_exception:" 
    traceback.print_exception(exc_type, exc_value, exc_traceback, 
           limit=2, file=sys.stdout) 
    print "*** print_exc:" 
    traceback.print_exc() 
    print "*** format_exc, first and last line:" 
    formatted_lines = traceback.format_exc().splitlines() 
    print formatted_lines[0] 
    print formatted_lines[-1] 
    print "*** format_exception:" 
    print repr(traceback.format_exception(exc_type, exc_value, 
              exc_traceback)) 
    print "*** extract_tb:" 
    print repr(traceback.extract_tb(exc_traceback)) 
    print "*** format_tb:" 
    print repr(traceback.format_tb(exc_traceback)) 
    print "*** tb_lineno:", exc_traceback.tb_lineno 
50

समाधान, मुद्रण फ़ाइल नाम, LineNumber, लाइन ही है और अपवाद Descrition:

import linecache 
import sys 

def PrintException(): 
    exc_type, exc_obj, tb = sys.exc_info() 
    f = tb.tb_frame 
    lineno = tb.tb_lineno 
    filename = f.f_code.co_filename 
    linecache.checkcache(filename) 
    line = linecache.getline(filename, lineno, f.f_globals) 
    print 'EXCEPTION IN ({}, LINE {} "{}"): {}'.format(filename, lineno, line.strip(), exc_obj) 


try: 
    print 1/0 
except: 
    PrintException() 

आउटपुट:

EXCEPTION IN (D:/Projects/delme3.py, LINE 15 "print 1/0"): integer division or modulo by zero 
0

सबसे आसान तरीका है बस का उपयोग करने के है:

import traceback 
try: 
    <blah> 
except IndexError: 
    traceback.print_exc() 

या यदि प्रवेश का उपयोग कर:

import logging 
try: 
    <blah> 
except IndexError as e: 
    logging.exception(e) 
संबंधित मुद्दे