【问题标题】:Find last attempted instruction before exception查找异常前最后一次尝试的指令
【发布时间】:2018-11-03 17:46:06
【问题描述】:

我正在尝试找出触发异常的最后一条尝试指令,例如类型错误。

让我们考虑这个例子。

def test(value1, value2):
    print("Hello" + value1 + value2)

如果调用此函数:

test("World!", 5)
test(5, "World!")

在这两种情况下我都会收到 TypeError。但是,在第一次执行中,将尝试(并触发错误)的最后一条语句是"Hello" + value1。在第二次执行中,它将是"Hello World!" + value2。至少这是我的假设,Python 分别执行两者,因为它们是对 add 运算符的“调用”?

不过,两次的错误信息都是一样的。说:

...
    print("Hallo" + value1 + value2)
TypeError: must be str, not int

我可以找出最后执行的语句是什么触发了 TypeError 吗?

【问题讨论】:

  • 你尝试调试代码吗?
  • 不,这是尝试构建动态类型推断器之类的东西的一部分。
  • 不,除非您单独解决添加问题,否则您不能这样做
  • 字节码级别的 Python 不是分别执行两个添加吗?导致错误的添加不应该是堆栈跟踪中的最后一行(或者可能根本不显示)吗?

标签: python python-3.x exception


【解决方案1】:

如果操作数在同一行,则不能(python 回溯中没有“列”的概念)。但是您可以通过将表达式分散在多行上来解决此问题:

def test(value1, value2):
    print(("Hello" + value1 +
    value2))

(注意添加的括号避免在行尾使用\

现在有了test(5, "World!"),你就得到了

  File "D:\module2.py", line 2, in test
    print(("Hello" + value1 +
TypeError: Can't convert 'int' object to str implicitly

test("World!", 5) 你会得到

    test("World!", 5)
  File "D:\module2.py", line 3, in test
    value2))
TypeError: Can't convert 'int' object to str implicitly

所以根据错误,你会得到第 2 行或第 3 行。

隐含地,简洁的异常处理鼓励您避免一次性编写复杂的表达式。要么分解计算,要么使用几行来编写表达式。

【讨论】:

  • 我明白了,这样我就不得不解析消息了。
  • 我只是设法检查,Python确实会一个接一个地执行加号操作,但是一旦抛出异常,似乎我们得到了多远的信息似乎丢失了。
  • 是的,加号操作是从左到右完成的。如果您使用异常信息,则不需要解析消息。像e.__traceback__.tb_next.tb_lineno 在函数中获取异常行。 traceback 对象包含更多结构化信息,因此您不必解析异常消息。
  • 非常感谢,这并没有完全解决我的问题,但它已经开始了。
猜你喜欢
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多