Я полагаю, что несколько ответов здесь, рекомендующих вам более тщательно управлять своими try/except
блоками, - это ответ, который вы ищете. Это стиль, а не библиотека.
Однако иногда мы оказываемся в ситуации, когда это не стиль, и вам действительно нужно нужен номер строки, чтобы выполнить какое-то другое программирующее действие. Если это то, что вы спрашиваете, вы должны рассмотреть модуль traceback
. Вы можете извлечь всю необходимую вам информацию о самом последнем исключении. Функция tb_lineno
вернет номер строки, вызвавшей исключение.
>>> import traceback
>>> dir(traceback)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_format_final_exc_line', '_print', '_some_str', 'extract_stack', 'extract_tb', 'format_exc', 'format_exception', 'format_exception_only', 'format_list', 'format_stack', 'format_tb', 'linecache', 'print_exc', 'print_exception', 'print_last', 'print_list', 'print_stack', 'print_tb', 'sys', 'tb_lineno', 'types']
>>> help(traceback.tb_lineno)
Help on function tb_lineno in module traceback:
tb_lineno(tb)
Calculate correct line number of traceback given in tb.
Obsolete in 2.3
Более новые версии трассировки трассировки исправляют проблему до 2.3, позволяя приведенному ниже коду работать так, как было задумано: (это «правильный путь»)
import traceback
import sys
try:
raise Exception("foo")
except:
for frame in traceback.extract_tb(sys.exc_info()[2]):
fname,lineno,fn,text = frame
print "Error in %s on line %d" % (fname, lineno)