看来,SyntaxErrorS(和TypeErrorS)由凸起compile()功能被不包括在堆栈跟踪返回的sys.exc_info(),但被打印为使用格式化输出的一部分traceback.print_exc.
例如,给定以下代码(其中filename包含带有该行的Python代码的文件的名称$ flagrant syntax error):
import sys
from traceback import extract_tb
try:
with open(filename) as f:
code = compile(f.read(), filename, "exec")
except:
print "using sys.exc_info:"
tb_list = extract_tb(sys.exc_info()[2])
for f in tb_list:
print f
print "using traceback.print_exc:"
from traceback import print_exc
print_exc()
Run Code Online (Sandbox Code Playgroud)
我得到以下输出(其中<scriptname>是包含上述代码的脚本的名称):
using sys.exc_info:
('<scriptname>', 6, 'exec_file', 'code = compile(f.read(), filename, "exec")')
using traceback.print_exc:
Traceback (most recent …Run Code Online (Sandbox Code Playgroud) 我正在使用AWS并使用AWS Cloudwatch查看日志。虽然事情在AWS上不会中断,但可以。我只是有这种情况。然后我搜索Traceback并得到线
Traceback (most recent call last):
Run Code Online (Sandbox Code Playgroud)
没有实际的追溯。我有一个有效的结构化日志记录设置(请参阅其他问题),我想以类似的方式获取回溯。
所以代替:
Traceback (most recent call last):
File "/home/math/Desktop/test.py", line 32, in <module>
adf
NameError: name 'adf' is not defined
Run Code Online (Sandbox Code Playgroud)
就像是
{"message": "Traceback (most recent call last):\n File \"/home/math/Desktop/test.py\", line 32, in <module>\n adf\n NameError: name 'adf' is not defined", "lineno": 35, "pathname": "/home/math/Desktop/test.py"}
Run Code Online (Sandbox Code Playgroud)
甚至还可以使用JSON格式的字符串。
我能想到的唯一方法是巨大的try-except块。宠物小精灵风格。有更好的解决方案吗?
我使用RStudio;我有script1导入script2与source; script2中的函数会导致错误。第一次发生时,Rstudio告诉我x行的脚本1导致y行的script2错误。如果我重新运行它,它只会告诉我有关script2中的错误。为什么?这会使调试变得比原本要痛苦得多。
更详细:
我有一个myfun.R包含此功能的文件(当然,这只是一个玩具示例):
sum_2_nums <- function(x,y) {
out <- x + y
return(out)
}
Run Code Online (Sandbox Code Playgroud)
然后,我使用将该函数导入另一个文件source:
source("myfun.R")
mysum <- sum_2_nums(3,"hello")
Run Code Online (Sandbox Code Playgroud)
RStudio设置为debug -> on error -> error inspector。当我运行上面的代码时,我看到:
这告诉我myfun.R第12行中的错误是由try_traceback.R第13行引起的。
但是,如果我再次运行该脚本,则会得到:
即错误不再追溯到try_traceback.R。我需要traceback()在控制台中键入才能看到。为什么?第二次的不同行为确实使我感到困惑。这使调试不必要地痛苦了!有办法避免吗?
注意这个问题是不是一个重复此:他们可能看起来相似,但答案给出了使用的有echo=TRUE或verbose=TRUE没有不解决对跟踪误差的第一.R文件我的观点。
我在这里看到了相同的问题,但仍未得到解答。
为了澄清,在回答一些评论时:
就像我说的,如果我单击“调试”->“错误”->“我看到”“错误检查器”被选中。
如果我options(error=function()traceback(1))在控制台中键入,屏幕上什么也不会发生,但是“错误检查器”被取消选择
我的代码中没有其他内容。这是一个玩具示例,仅显示了我所显示的线条,而没有其他内容。我不知道还有什么可以澄清的-任何指导将不胜感激。
我对R非常陌生。我使用Python进行数据分析,但对R感到好奇。我听说R的调试麻烦得多,并且想自己尝试一下。假设即使只追溯这样的常规错误也是有问题的,我也不会花很多时间学习R,所以我想了解我是否做错了什么,或者调试和追溯总是R中的这个
当我说“运行”时,我的意思是单击RStudio中的“源”按钮(“运行”旁边的按钮
sessionInfo()显示:
sessionInfo() R version 3.5.3 (2019-03-11) Platform:
x86_64-w64-mingw32/x64 (64-bit) Running under: Windows >= 8 …Run Code Online (Sandbox Code Playgroud) 这是典型的Ruby on Rails回溯的最后几帧:

以下是Python中典型Nevow回溯的最后几帧:

它不仅仅是网络环境,你可以在ipython和irb之间进行类似的比较.我怎样才能在Ruby中获得更多这类细节?
在我当前的模型User中,我有一个字段"name",它不能为null.
我尝试创建一个用户对象,并将其添加到Pyramid提供的DBSession并使用事务提交,就像这样.
with transaction.manager:
u = models.User()
models.DBSession.add(u)
Run Code Online (Sandbox Code Playgroud)
对于那些不使用金字塔的人,DBSession是:
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Run Code Online (Sandbox Code Playgroud)
现在,在上面的交易中,我确实有一个验证问题 - 我需要为User分配一个名称,但我没有.但是,我没有收到错误告诉我"你需要为用户分配一个名字!",我得到了这个:
<ipython-input-5-47d9c0e393f7> in <module>()
2 u = models.User()
----> 3 models.DBSession.add(u)
4
/home/user/Projects/env/local/lib/python2.7/site-packages/transaction-1.4.1-py2.7.egg/transaction/_manager.pyc in __exit__(self, t, v, tb)
118 def __exit__(self, t, v, tb):
119 if v is None:
--> 120 self.commit()
121 else:
122 self.abort()
/home/user/Projects/env/local/lib/python2.7/site-packages/transaction-1.4.1-py2.7.egg/transaction/_manager.pyc in commit(self)
109 """ See ITransactionManager.
110 """
--> 111 return self.get().commit()
112
113 def abort(self):
/home/user/Projects/env/local/lib/python2.7/site-packages/transaction-1.4.1-py2.7.egg/transaction/_transaction.py in commit(self)
276 tb = None
277 try:
--> 278 t, v, …Run Code Online (Sandbox Code Playgroud) 我很困惑为什么当我编写的模块中的函数出现错误时,IPython 没有向我显示函数中导致错误的行的完整回溯。
注意:我对这个特定错误的原因并不感到困惑,而是对为什么 IPython 没有向我展示原因感到困惑。
我的模块被调用module.py,它包含函数function,在它下面写了一个if __name__ == '__main__'块。(模块和函数名称已更改以保护无辜者的身份——或者可能不是那么无辜。)
这是引发错误时我得到的回溯。(注意缺少关于哪一行function导致错误的信息。)
In [1]: import module as m
In [2]: call = m.function('hello')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-ec0c1e40ec8c> in <module>()
----> 1 call = m.function('hello')
/home/module.py in function(greeting)
TypeError: join() takes exactly one argument (2 given)
Run Code Online (Sandbox Code Playgroud) 是否有一种简单的方法来禁用Python 3中的Handler或的异常堆栈跟踪记录Formatter?
我需要在另一个中进行堆栈跟踪Handler,因此exc_info=False在的调用中设置,Logger不是一个选择。有没有比定义自己的方法更简单的方法Formatter?
我正在编写一个用于执行 python 代码的小软件,我想打印异常。执行以下函数:
def run(self, mode='activate'):
try:
exec(self.mycode)
except Exception:
print(traceback.format_exc())
Run Code Online (Sandbox Code Playgroud)
没有关于 exec() 函数中到底执行什么的信息,它实际上可以是任何 python 代码。我想在通过 exec() 执行时以某种方式打印抛出的异常(主要是由于代码错误而由 python 自动生成),包括传递到抛出异常的 exec() 函数的代码行。到目前为止,我只设法将 'exec(mycode)' 作为异常代码输出,但我想要在mycode中崩溃的实际代码行。
我正在尝试为我的代码编写一个很好的错误处理程序,以便当它失败时,日志、回溯和其他相关信息会通过电子邮件发送给我。
我不知道如何获取异常对象并提取回溯。
我发现该traceback模块非常混乱,主要是因为它根本不处理异常。它只是从某处获取一些全局变量,假设我想要最新的异常。但如果我不这样做呢?如果我想忽略错误处理程序中的某些异常怎么办?(例如,如果我无法向我发送电子邮件并想重试。)
import traceback as tb
# some function that will fail after a few recursions
def myfunc(x):
assert x > 0, "oh no"
return myfunc(x-1)
try:
myfunc(3)
except Exception as e:
traceback_str = tb.something(e)
Run Code Online (Sandbox Code Playgroud)
请注意,tb.something 将e作为参数。
Stack Overflow 上有很多关于使用traceback模块获取回溯字符串的问题。这个问题的独特之处在于如何从捕获的异常而不是全局变量中获取它。
结果:
traceback_str 包含字符串:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in myfunc
File "<stdin>", line 3, in myfunc
File "<stdin>", …Run Code Online (Sandbox Code Playgroud)