try:
print blah
except KeyError:
traceback.print_exc()
Run Code Online (Sandbox Code Playgroud)
我曾经像这样调试.我打印到控制台.现在,我想记录所有内容而不是打印,因为Apache不允许打印.那么,如何记录整个回溯?
如何在以下情况下获得完整的回溯,包括调用func2
和func
函数?
import traceback
def func():
try:
raise Exception('Dummy')
except:
traceback.print_exc()
def func2():
func()
func2()
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我得到:
Traceback (most recent call last):
File "test.py", line 5, in func
raise Exception('Dummy')
Exception: Dummy
Run Code Online (Sandbox Code Playgroud)
traceback.format_stack()
不是我想要的,因为需要将traceback
对象传递给第三方模块.
我对这个案子特别感兴趣:
import logging
def func():
try:
raise Exception('Dummy')
except:
logging.exception("Something awful happened!")
def func2():
func()
func2()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我得到:
ERROR:root:Something awful happened!
Traceback (most recent call last):
File "test.py", line 9, in func
raise Exception('Dummy')
Exception: Dummy
Run Code Online (Sandbox Code Playgroud) 考虑
try:
import someProprietaryModule
except ImportError:
raise ImportError('It appears that <someProprietaryModule> is not installed...')
Run Code Online (Sandbox Code Playgroud)
运行时,如果未安装someProprietaryModule,则可以看到:
(traceback data)
ImportError: unknown module: someProprietaryModule
During handling of the above exception, another exception occurred:
(traceback data)
ImportError: It appears that <someProprietaryModule> is not installed...
Run Code Online (Sandbox Code Playgroud)
也许我不希望出现"在处理上述异常......"行(以及它上面的行).我能做到这一点:
_moduleInstalled = True
try:
import someProprietaryModule
except ImportError:
_moduleInstalled = False
if not _moduleInstalled:
raise ImportError('It appears that <someProprietaryModule> is not installed...')
Run Code Online (Sandbox Code Playgroud)
但这感觉有点像黑客.我还能做什么?
我有一个traceback对象,我希望以调用时得到的漂亮格式显示traceback.format_exc()
.
这有内置函数吗?还是几行代码?
我正在研究第三方开发人员使用的Python库,为我们的核心应用程序编写扩展.
我想知道是否可以在引发异常时修改回溯,因此最后一个堆栈框架是在开发人员代码中调用库函数,而不是引发异常的库中的行.堆栈底部还有一些框架,其中包含对第一次加载我理想情况下要移除的代码时使用的函数的引用.
提前感谢任何建议!
当你点击Ctrl+ c,即KeyboardInterrupt
在Python脚本中加注时,有没有办法让追溯不会出现?
Python 3很整洁
try:
raise OneException('sorry')
except OneException as e:
# after a failed attempt of mitigation:
raise AnotherException('I give up') from e
Run Code Online (Sandbox Code Playgroud)
允许在不丢失上下文的情况下引发后续异常的语法.我在Python 2中可以提出的最好的比喻是
raise AnotherException((e,'I give up')), None, sys.exc_info()[2]
Run Code Online (Sandbox Code Playgroud)
这(e,'')
是一个丑陋的黑客,它将原始异常的名称包含在消息中.但是不是有更好的方法吗?
我有如下记录功能.
logging.basicConfig(
filename = fileName,
format = "%(levelname) -10s %(asctime)s %(message)s",
level = logging.DEBUG
)
def printinfo(string):
if DEBUG:
logging.info(string)
def printerror(string):
if DEBUG:
logging.error(string)
print string
Run Code Online (Sandbox Code Playgroud)
我需要登录行号,堆栈信息.例如:
1: def hello():
2: goodbye()
3:
4: def goodbye():
5: printinfo()
---> Line 5: goodbye()/hello()
Run Code Online (Sandbox Code Playgroud)
我怎么能用Python做到这一点?
def printinfo(string):
if DEBUG:
frame = inspect.currentframe()
stack_trace = traceback.format_stack(frame)
logging.debug(stack_trace[:-1])
if LOG:
logging.info(string)
Run Code Online (Sandbox Code Playgroud)
给我这个信息,这正是我需要的.
DEBUG 2011-02-23 10:09:13,500 [
' File "/abc.py", line 553, in <module>\n runUnitTest(COVERAGE, PROFILE)\n',
' File "/abc.py", line 411, in runUnitTest\n …
Run Code Online (Sandbox Code Playgroud) 如果我理解正确,默认情况下Lua会在发生错误时调用调试库"debug.traceback".
但是,当将Lua嵌入到C代码中时,就像这里的示例中所做的那样: 简单的Lua API示例
我们只在堆栈顶部提供错误消息.
即
if (status) {
/* If something went wrong, error message is at the top of */
/* the stack */
fprintf(stderr, "Couldn't load file: %s\n", lua_tostring(L, -1));
/* I want to print a stacktrace here. How do I do that? */
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
初始错误后如何从C打印堆栈跟踪?
当Python中发生异常时,您可以检查堆栈吗?你能确定它的深度吗?我查看了traceback模块,但我无法弄清楚如何使用它.
我的目标是捕获在解析eval表达式期间发生的任何异常,而不会捕获它可能调用的任何函数抛出的异常.不要因为使用eval而责备我.这不是我的决定.
注意:我想以编程方式而不是交互方式执行此操作.
traceback ×10
python ×8
exception ×2
logging ×2
python-3.x ×2
stack-trace ×2
django ×1
format ×1
lua ×1
lua-api ×1
object ×1
python-2.7 ×1
python-3.3 ×1
raise ×1