我只是吹了几天跟踪python脚本中的错误(我不知道,web2py使用了与我期望的不同的根目录,导致文件读取无声地失败。因此当从命令行运行时,代码很好,但是当从web运行时,代码失败了)。 终于找到了罪魁祸首我可以修复无声失败(在这个案例中是在库中,openCV),但是如果存在某种系统日志,那么聪明的侦探就会看到失败。然后,无论沉默失败在哪里,我仍然看到它,并且不必费心追查失败 那么 - 是否存在某种针对linux的全局错误日志文件,它记录了文件读取错误等内容? 是的,我知道有python特定的错误记录,但问题仍然存在。例如如果我有一个复杂的项目与一些python,一些C,一些什么,某人在某处默默地失败,系统范围的错误日志将是非常有帮助。
答案 0 :(得分:1)
这个解决方案可能无法满足您的需求,但无论我想报告一些我做过的研究,都可能会引导您朝着正确的方向发展。
首先,在/ var / log下有linux系统的日志记录。有趣的是syslog和messages文件,它们记录各种系统事件。但是不记录文件读取“错误”,如下所述。
在打开不存在的文件的情况下,我们最终会找到失败的open system call(python's open calls this)。但是在这个低级别没有异常的概念 - 如果打开失败,它只返回一个负数。在C中,您可以打开一整天都不存在的文件,但程序仍然会返回0错误代码。
这意味着您必须自己做一些工作来跟踪此问题。我问你的问题是,“如何在低于python的例外情况下跟踪这些错误?”为此,您可以使用strace和grep的组合。您为每个进程附加strace并记录发生的所有系统调用。
想象一下,我们有一个看起来像这样的C程序:
#include <stdio.h>
int main()
{
fopen("nothere.txt","r");
}
运行strace ./test 2&gt;&amp; 1 | grep ENOENT,我们得到:
open("nothere.txt", O_RDONLY) = -1 ENOENT (No such file or directory)
你当然可以在python进程上运行strace来获得相同的结果。
要警惕的事情:
答案 1 :(得分:0)
也许您可以发布正在读取文件的代码? open()失败应始终生成IOError
异常:
with open('no-such-file') as f:
print f.read()
Traceback (most recent call last):
File "app.py", line 1, in <module>
with open('no-such-file') as f:
IOError: [Errno 2] No such file or directory: 'no-such-file'
令人沮丧的原因很可能是错误的异常处理,如下面的代码所示:
try:
with open('no-such-file') as f:
print f.read()
except Exception, e:
print 'bad exception handling here'