【问题标题】:Python exception backtrace tells me where line ends, where does it begin?Python 异常回溯告诉我行在哪里结束,从哪里开始?
【发布时间】:2008-11-14 21:31:10
【问题描述】:

当跨越多行的代码抛出 Python 异常时,例如:

   myfoos = [foo("bar",
                "baz",
                "quux",
                 i) for i in range(10)]

Python 将报告最后一行的行号,并显示该行的代码片段:

Traceback (most recent call last):
  File "test.py", line 4, in <module>
    i) for i in range(10)]
NameError: name 'foo' is not defined

有没有办法确定第一行是什么?有什么方法可以捕获异常并操纵traceback 对象以便能够报告类似的内容:

Traceback (most recent call last):
 File "test.py", lines 1-4 in <module>
   myfoos = [foo("bar",
                "baz",
                "quux",
                 i) for i in range(10)]
 NameError: name 'foo' is not defined

【问题讨论】:

    标签: python exception


    【解决方案1】:

    找到行首会非常困难。您必须解析 Python 或者深入研究编译后的字节码。标准库中有用于解析 Python 的模块,但我可以根据经验告诉你,解释它们的输出是一门黑色艺术。而且我也不确定编译后的字节码是否有答案……

    【讨论】:

      【解决方案2】:

      在 try/except 块中,您可以排除 NameError 并尝试设置 NameError.lineno,尽管我不确定这是否或如何工作,但这是迄今为止我发现的最好的。

      try:
          somecode
      except NameError
          NameError.lineno = [1,4]
      

      您必须自己弄清楚语句在哪里开始和结束,以及哪个语句引发了错误。

      希望对你有帮助

      【讨论】:

      • 我要问的部分是弄清楚语句的开始和结束时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2017-05-17
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多