gpt4 book ai didi

python - 从 pdb 知道哪一行引发异常并查看堆栈跟踪的快速而肮脏的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 15:05:15 25 4
gpt4 key购买 nike

假设我有一个非常基本的程序,肯定会抛出异常。我向其中添加了一个 pdb.set_trace(),我希望能够在发生错误时环顾四周。

import pdb
from random import randint

def two_possible_errors(input):

try:
assert input % 2, "error!"
assert not input % 2, "error!"
except Exception, e:
pdb.set_trace()
raise

two_possible_errors(randint(0,9))

我的问题是当我捕捉到异常时,我已经在 except 子句中了,我真的不知道错误实际发生在哪里。通常,我会四处看看,但如果我想查看堆栈跟踪,我需要恢复执行并等待程序崩溃。有没有更好的办法?

好的,让我们从异常开始。在这种特殊情况下,我可以在 assert 上添加一条消息,但那不是重点。

> /Users/jluc/kds2/wk/explore/explore_pdb_exceptions.py(16)two_possible_errors()
-> raise
(Pdb) e
AssertionError('error!',)

此时,我不知道这两行中哪一行出错了。

让我们试试哪里。它返回当前位置,而不是异常发生的位置。

(Pdb) where
/Users/jluc/kds2/wk/explore/explore_pdb_exceptions.py(20)<module>()
-> test()
/Users/jluc/kds2/wk/explore/explore_pdb_exceptions.py(18)test()
-> two_possible_errors(randint(0,9))
> /Users/jluc/kds2/wk/explore/explore_pdb_exceptions.py(16)two_possible_errors()
-> raise

为了确定,让我们打印第 16 行:

(Pdb) l 16
11 try:
12 assert input % 2, "error!"
13 assert not input % 2, "error!"
14 except Exception, e:
15 pdb.set_trace()
16 -> raise
17
18 two_possible_errors(randint(0,9))
19
20 test()

为了真正知道我在哪里,我可以让 pdb (c)ontinue 并检查退出堆栈跟踪。但现在我完全脱离了 pdb。有没有一种简单的方法可以从异常本身获取信息?在继续之前?

(Pdb) c
Traceback (most recent call last):
File "explore_pdb_exceptions.py", line 20, in <module>
test()
File "explore_pdb_exceptions.py", line 18, in test
two_possible_errors(randint(0,9))
File "explore_pdb_exceptions.py", line 13, in two_possible_errors
assert not input % 2, "error!"
AssertionError: error!

最佳答案

怎么样:

import traceback
traceback.print_exc()

这应该打印当前正在处理的异常的回溯(触发 except 控制 block 的异常)。

如果在 pdb 中键入命令,它将尝试将第二个命令解释为 pdb 命令。通过在命令前添加 p 来防止这种情况。

作为引用,traceback模块。

关于python - 从 pdb 知道哪一行引发异常并查看堆栈跟踪的快速而肮脏的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33578593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com