1
Livid MOD |
2
binux 2013-10-12 18:09:34 +08:00
捕获你能处理的异常,其他时候请让程序挂掉
定义:能处理的异常 当异常发生时,你知道应该如何恢复/继续执行 |
3
hepochen 2013-10-12 20:55:49 +08:00 1
建议使用@Livid 推荐的sentry,它源码是开放的,自己的github上下过来搭一个,会方便很多。
另外,不推荐“尽你所能去捕获异常”,异常的捕获可以作为基础逻辑进行判断,这确实是Python的一个特性;但是捕获所有的异常,这不现实。 如果所有异常需要输出,比较快的方法是写个函数(来处理/打印异常信息),最后将函数赋值给sys.excepthook上就可以了。 “我感觉程序崩溃了直接根据异常查错误就完了,捕获了再退出岂不是多此一举?” --> 关于这个问题,你自己再想想? |
4
Muninn OP @Livid 谢谢 我研究研究
@binux 我是用这个思路的 但是我的问题是 daemon程序挂掉以后我想看到记录,现在我不知道它怎么挂掉的。 @hepochen 你也说了,不推荐尽可能的捕获异常。我一直是异常没必要导致程序崩溃我会捕获,其他的不捕获。这在主动执行的脚本没问题,异常了在屏幕上可以看到,但是python的logging模块不能打印出来没捕获的这些异常。 我写的是后台程序,不会往screen上输出东西,程序崩溃了以后异常信息就不见了。。。 所以我觉得logging非要捕获了再输出多此一举,官方文档虽然用一节解释了这个事情,我依然觉得应该有选项可以往日志输出异常我每找到。。。后来想明白,程序崩溃了logging应该已经无法工作了,这是逻辑问题,应该必须用第三方的观察者解决。 |
5
sethverlo 2013-10-12 22:15:20 +08:00
突然想到知乎有个问题叫「Fenng 都推荐过哪些靠谱的东西」……
感觉 Livid 手里的好玩儿的肯定更多…… |
6
hepochen 2013-10-13 01:57:05 +08:00 1
@Muninn 你没有明白我的意思。
1, 如果是整个程序挂掉了,logging最后是默认在工作的,也就是一般情况下,你自己运行一个py文件,然后报错的输出。这个原理跟重写一个sys.excepthook是一样的。 2,如果是以daemon运行,那么你需要的是让err logging最终保留到一个日志中。也就是你要把stderr从屏幕打印转为文件保存。建议试试supervisor,里面有redirect_stderr与stdout_logfile可以进行配置。 3,如果只是想极简单的处理这个问题,自己写个函数,处理错误的信息(即保存到某个文本中),赋值给sys.excepthook就可以了。 - - - - “我感觉程序崩溃了直接根据异常查错误就完了,捕获了再退出岂不是多此一举?” 触发的错误,即使是同一种错误,但是触发点(运行时的错误点)在不同文件中,那么收集到的错误信息也是不一样的,包括所在代码行,当前运行的上下文环境等。你可能会遇到很多基本就无法重现的问题,(多数是Web环境,或者其它非独自使用的程序)。呃,因为,我感觉可能是自己水平所限,无法解释清楚了。所以,我说,你再想想? |