Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python';中查看异常的详细信息;调试器是什么?_Python_Debugging - Fatal编程技术网

如何在Python';中查看异常的详细信息;调试器是什么?

如何在Python';中查看异常的详细信息;调试器是什么?,python,debugging,Python,Debugging,有时在调试时会引发异常 例如,考虑这个代码: def some_function(): # Pretend this function is in a library... # ...and deep within the library is an exception: raise Exception('An exception message with valuable information.') import pdb; pdb.set_trace() try:

有时在调试时会引发异常

例如,考虑这个代码:

def some_function():  # Pretend this function is in a library...
    # ...and deep within the library is an exception:
    raise Exception('An exception message with valuable information.')

import pdb; pdb.set_trace()
try:
    some_function()  # Pretend I am debugging from this point using pdb.
except:
    pass
some_function()
调用进行调试时,如果发出
next
命令,我将看到有关引发[和捕获]的异常的以下详细信息:

例外情况:例外情况…,)
这是我工作的终端的直接拷贝/粘贴:

/tmp/test.py(7)()
->一些函数()#假设我正在使用pdb从这一点进行调试。
(Pdb)下一步
例外情况:例外情况…,)
>/tmp/test.py(7)()
->一些函数()#假设我正在使用pdb从这一点进行调试。
(Pdb)

查看整个异常消息将非常有用。如何在pdb中做到这一点?

python调试器不会“在异常时中断”-如果您习惯了该功能,这可能会非常令人沮丧。因此,我采用了记录strack跟踪并从那里返回的策略

import logging
try:
    raise Exception('An exception message with valuable information.')
except:
    logging.exception('Error in test code')
如果您使用一个好的IDE(例如带有pydev的Eclipse),stacktrace的日志条目将被制作成超链接,直接跳转到代码中的适当位置

通过导入回溯,可以在代码中的任意点转储堆栈跟踪

import traceback
trace = traceback.format_exc()

pdb
将异常类型和值存储在
中。您可以在
pdb
中打印回溯的异常部分,方法是:

import traceback; print "".join(traceback.format_exception_only(*__exception__))
例如:

/tmp/test.py(7)()
->一些函数()#假设我正在使用pdb从这一点进行调试。
(Pdb)下一步
例外情况:例外情况…,)
>/tmp/test.py(7)()
->一些函数()#假设我正在使用pdb从这一点进行调试。
(Pdb)导入回溯;打印“.join”(仅限追溯.格式\u异常(*\uu异常\uu))
异常:包含有价值信息的异常消息。
(Pdb)
不幸的是,这不包括其余的回溯,但所有这些信息都可以通过
pdb
where
命令获得。如果您确实需要完整的回溯,可以将以下内容添加到
~/.pdbrc
文件中,或将其粘贴到终端中:

!global __currentframe, __stack; from inspect import currentframe as __currentframe, stack as __stack
!global __format_exception_only, __print_stack; from traceback import format_exception_only as __format_exception_only, print_stack as __print_stack
!global __Pdb; from pdb import Pdb as __Pdb

# find the last frame on the stack with an object named "pdb" or "self" that is a pdb.Pdb object
# works for pdb called the usual way, or pdb.pm(), or pdb.set_trace()
!global __pdb; __pdb = [__framerec[0].f_locals.get("pdb") or __framerec[0].f_locals.get("self") for __framerec in __stack() if (__framerec[0].f_locals.get("pdb") or __framerec[0].f_locals.get("self")).__class__ == __Pdb][-1]

alias traceback __print_stack(__pdb.stack[-1][0]); print "".join(__format_exception_only(*__exception__))
然后,您只需使用新的
回溯
别名即可获得所需:

/tmp/test.py(7)()
->一些函数()#假设我正在使用pdb从这一点进行调试。
(Pdb)下一步
例外情况:例外情况…,)
>/tmp/test.py(7)()
->一些函数()#假设我正在使用pdb从这一点进行调试。
(Pdb)回溯
文件“test.py”,第7行,在
一些函数()#假设我正在使用pdb从这一点进行调试。
文件“test.py”,第3行,在某些函数中
引发异常(“包含有价值信息的异常消息”)
异常:包含有价值信息的异常消息。
(Pdb)

警告:所有这些都依赖于未记录的
pdb
bdb
内部,并且可能会损坏。

最好使用
logging.exception('information message')
记录异常回溯,以及有关失败操作的任何信息(“information message”,可能有参数等)。您可以使用
logging.DEBUG(…,exc_info=True)
在任何级别(例如DEBUG)进行日志记录。我不知道这一点-谢谢Vinay。如果您同意,我将更新我的答案?我使用的是twisted.python.log。我可以使用日志记录,但我不想。此外,尝试:提高;除了:。。。不是在我的代码中,而是在twisted的某个地方(至少我这么认为)。因此,如果我要像那样使用日志记录,我必须修改扭曲的代码。使用
python-mpdb
后跟脚本文件名。我通常做的是运行
python-I
或设置
PYTHONINSPECT
环境变量,然后使用
import-pdb;pdb.pm()
发生异常。您使用的是什么版本的Python?我的版本不是这样截短的。版本2.7.1。请注意,raise语句是完整打印的,所以乍一看,您可能认为整个异常都打印出来了,但当实际异常被pdb“截获”(我不知道该术语)时,它被截断了。实际上,我编写了自己的Python调试器变体,但它没有这样做,也意味着自动进入调试器(使用sys.excepthook)。如果你喜欢,你可以试试。这是子包。谢谢你的非常有用的破解。令人失望的是,没有正常的方式来做如此普通和有用的事情。这种方法也适用于pdb++,所以我将通过
ipdb
切换到它。