Python 怎么把没捕获的异常打印到日志里

2013-10-12 17:51:55 +08:00
 Muninn
我完全是新手,之前都是用python写写小脚本,没有考虑过这种问题.

现在做一个项目,我知道在捕获异常后可以logging.exception打出来.

但是假如一个没有预料到的异常出现了.
然后在日志里没有记录.
我从何查起啊? 去哪找这异常.
能把所有的异常都直接输出到logging模块吗?

这又涉及到另一个问题.
主流观点到底推荐不推荐尽我所能的去捕获异常.
我感觉程序崩溃了直接根据异常查错误就完了,捕获了再退出岂不是多此一举?
9978 次点击
所在节点    Python
7 条回复
Livid
2013-10-12 18:06:25 +08:00
binux
2013-10-12 18:09:34 +08:00
捕获你能处理的异常,其他时候请让程序挂掉

定义:能处理的异常
当异常发生时,你知道应该如何恢复/继续执行
hepochen
2013-10-12 20:55:49 +08:00
建议使用@Livid 推荐的sentry,它源码是开放的,自己的github上下过来搭一个,会方便很多。

另外,不推荐“尽你所能去捕获异常”,异常的捕获可以作为基础逻辑进行判断,这确实是Python的一个特性;但是捕获所有的异常,这不现实。

如果所有异常需要输出,比较快的方法是写个函数(来处理/打印异常信息),最后将函数赋值给sys.excepthook上就可以了。

“我感觉程序崩溃了直接根据异常查错误就完了,捕获了再退出岂不是多此一举?” --> 关于这个问题,你自己再想想?
Muninn
2013-10-12 22:11:58 +08:00
@Livid 谢谢 我研究研究

@binux 我是用这个思路的 但是我的问题是 daemon程序挂掉以后我想看到记录,现在我不知道它怎么挂掉的。

@hepochen 你也说了,不推荐尽可能的捕获异常。我一直是异常没必要导致程序崩溃我会捕获,其他的不捕获。这在主动执行的脚本没问题,异常了在屏幕上可以看到,但是python的logging模块不能打印出来没捕获的这些异常。 我写的是后台程序,不会往screen上输出东西,程序崩溃了以后异常信息就不见了。。。 所以我觉得logging非要捕获了再输出多此一举,官方文档虽然用一节解释了这个事情,我依然觉得应该有选项可以往日志输出异常我每找到。。。后来想明白,程序崩溃了logging应该已经无法工作了,这是逻辑问题,应该必须用第三方的观察者解决。
sethverlo
2013-10-12 22:15:20 +08:00
突然想到知乎有个问题叫「Fenng 都推荐过哪些靠谱的东西」……

感觉 Livid 手里的好玩儿的肯定更多……
hepochen
2013-10-13 01:57:05 +08:00
@Muninn 你没有明白我的意思。

1, 如果是整个程序挂掉了,logging最后是默认在工作的,也就是一般情况下,你自己运行一个py文件,然后报错的输出。这个原理跟重写一个sys.excepthook是一样的。

2,如果是以daemon运行,那么你需要的是让err logging最终保留到一个日志中。也就是你要把stderr从屏幕打印转为文件保存。建议试试supervisor,里面有redirect_stderr与stdout_logfile可以进行配置。

3,如果只是想极简单的处理这个问题,自己写个函数,处理错误的信息(即保存到某个文本中),赋值给sys.excepthook就可以了。


- - - -

“我感觉程序崩溃了直接根据异常查错误就完了,捕获了再退出岂不是多此一举?”

触发的错误,即使是同一种错误,但是触发点(运行时的错误点)在不同文件中,那么收集到的错误信息也是不一样的,包括所在代码行,当前运行的上下文环境等。你可能会遇到很多基本就无法重现的问题,(多数是Web环境,或者其它非独自使用的程序)。呃,因为,我感觉可能是自己水平所限,无法解释清楚了。所以,我说,你再想想?
Muninn
2013-10-15 14:55:13 +08:00
@hepochen 感谢写了这么多 V2EX的新消息提示我总感觉有问题,经常不提示我.

其实我提出这问题就是有点强迫症而已. 我已经有一个日志文件了,现在出了异常却要把STDERR定向到另一个日志文件里. 写到同一个文件里吧,感觉又有点不好...哎 纠结

可能我写的程序类型比较单一,都是后台脚本或者进程,现在也在学着写web,到时就能和你们聊到一起了:)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/85366

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX