在python代码中找到发生异常的行号

alw*_*btc 10 python exception

我有一个类似于这样的代码:

try:
  if x:
      statement1
      statement2
      statement3
  elif y:
      statement4
      statement5
      statement6
  else:
      raise

except:
      statement7
Run Code Online (Sandbox Code Playgroud)

在这里,我确信异常发生在If x:块中,但我想知道在If x:异常发生的块的哪个语句中.有没有办法获得发生异常的行号?

问候,

Ant*_*Ant 21

那这个呢:

try:
  if x:
      print 'before statement 1'
      statement1
      print 'before statement 2' #ecc. ecc.
      statement2
      statement3
  elif y:
      statement4
      statement5
      statement6
  else:
      raise

except:
      statement7
Run Code Online (Sandbox Code Playgroud)

这是一个简单的解决方法,但我建议使用调试器

甚至更好,使用sys模块:D

try:
      if x:
          print 'before statement 1'
          statement1
          print 'before statement 2' #ecc. ecc.
          statement2
          statement3
      elif y:
          statement4
          statement5
          statement6
      else:
          raise
except:
    print sys.exc_traceback.tb_lineno 
    #this is the line number, but there are also other infos
Run Code Online (Sandbox Code Playgroud)


J.J*_*.J. 13

我相信这里的几个答案建议你try/except更紧密地管理你的积木是你正在寻找的答案.这是一种风格的东西,而不是图书馆的东西.

然而,有时我们发现自己在一个情况下它不是一种风格的东西,你真的需要的行号做一些其他programattic行动.如果这就是您所要求的,您应该考虑该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
Run Code Online (Sandbox Code Playgroud)

较新版本的回溯管道修复了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)
Run Code Online (Sandbox Code Playgroud)