67

Python を使用して、測定データを評価しています。考えられる結果が多数あるため、処理が難しいか、可能な組み合わせです。評価中にエラーが発生することがあります。測定データの範囲から外れるので、通常は指数誤差です。

問題が発生したコードの場所を見つけるのは非常に困難です。エラーが発生した行を知っていれば、非常に役立ちます。次のコードを使用する場合:

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

残念ながら、これはインデックスエラーがあることだけを教えてくれます。何が起こったのかを知るために、例外の詳細 (コード内の行、変数など) を知りたいです。出来ますか?

ありがとうございました。

4

8 に答える 8

95

解決策、ファイル名、行番号、行自体、および例外の説明を出力します。

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
于 2013-11-28T10:50:36.500 に答える
37

使用できる行番号を簡単に取得するには、さらに取得しsysたい場合はtracebackモジュールを試してください。

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

版画:

Error on line 3

tracebackモジュールのドキュメントからの例:

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
于 2013-01-25T09:53:29.580 に答える
15

最も簡単な方法は、次を使用することです。

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

またはロギングを使用する場合:

import logging
try:
    <blah>
except IndexError as e:
    logging.exception(e)
于 2017-12-19T00:28:07.863 に答える