2013-01-25 23 views
31

Tôi đang sử dụng python để đánh giá một số dữ liệu được đo. Bởi vì nhiều kết quả có thể khó xử lý hoặc có thể kết hợp. Đôi khi một lỗi xảy ra trong quá trình đánh giá. Nó thường là một lỗi chỉ mục bởi vì tôi vượt ra ngoài phạm vi từ dữ liệu đo được.Xử lý ngoại lệ Python - số dòng

Rất khó để tìm ra vị trí nào trong mã mà sự cố xảy ra. Nó sẽ giúp ích rất nhiều nếu tôi biết dòng lỗi nào được nêu ra. Nếu tôi sử dụng mã sau đây:

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

Thật không may điều này chỉ cho tôi biết rằng có lỗi và chỉ mục. Tôi muốn biết thêm chi tiết về ngoại lệ (dòng mã, biến, v.v.) để tìm hiểu điều gì đã xảy ra. Có thể không?

Cảm ơn bạn.

+1

Xem http://stackoverflow.com/questions/3702675/print-the-full-traceback-in-python-không-dừng-chương trình! –

+0

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

+2

@JeCh Câu trả lời có vẻ tốt. Hãy chấp nhận một. Để chấp nhận, nhấp vào dấu kiểm trống bên cạnh câu trả lời. –

Trả lời

16

Để chỉ nhận số dòng bạn có thể sử dụng sys, nếu bạn muốn có nhiều hơn, hãy thử mô-đun traceback.

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

in:

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

Solution, in tên tập tin, linenumber, dòng chính nó và ngoại lệ 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() 

Output:

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

Cách đơn giản nhất là chỉ cần sử dụng:

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

hoặc nếu sử dụng khai thác gỗ:

import logging 
try: 
    <blah> 
except IndexError as e: 
    logging.exception(e)