在python cod中查找发生异常的行号

2024-04-28 21:58:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似的代码:

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

except:
      statement7

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

谨致问候


Tags: 代码ifelseraisetryelifexceptstatement1
3条回答

您应该在调试器中运行程序,例如^{}。这将允许您正常运行代码,然后在发生类似意外情况时检查环境。

给定一个名为“main.py”的脚本,运行如下:

python -m pdb main.py

然后,当程序启动时,它将在调试器中启动。键入c继续,直到下一个断点(或崩溃)。然后,您可以通过执行诸如print spam.eggs之类的操作来检查环境。您还可以通过执行pdb.set_trace()(我通常执行import pdb; pdb.set_trace())来设置断点。

另外,什么意思是“语句3”可以引发异常?你在期待例外吗?如果是这样,最好在这个语句周围写一个try/except块,这样程序就可以继续运行了。

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

然而,有时我们发现自己处于这样一种情况:它不是一种风格的东西,而您确实需要行号来执行其他的程序操作。如果这就是您的要求,那么您应该考虑^{}模块。您可以提取有关最近异常的所有所需信息。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)

这个呢:

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

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

或者更好,使用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

相关问题 更多 >