Python/PyQt程序&打包程序异常退出却没有报错

Foreword

Python 程序,特别是多线程的PyQt程序的子线程有时候会异常退出,IDE却不会报错。提供一种可以捕捉异常的方法。

起因

在做PyQt的多线程的程序时,有一次程序异常退出,IDE却没有给出报错。

在分析了一番之后,在子线程里面某个可能会出错的地方加上了try之后就没有异常退出了。去掉之后又会异常退出而且不报错。

分析加百度之后(其实基本都是百度XD),得出结论:长话短说,就是Python里面有的异常捕捉机制,并不能完完全全的捕捉到所有的异常。

这样的问题,在PyQt的子线程中很容易出现,子线程中有异常,却不会有报错信息。

解决办法

解决办法也很简单,用IDE的话,可以在主函数前面加上cgitb这个包。用法如下:

1
2
import cgitb
cgitb.enable(format='text')

添加了之后,会在调试输出里面生成一个很详细的回溯,详细到你根本都用不着=。=,而且即使是很小的异常都会捕捉到,可以说是很敏感了。

官方文档

什么?看不懂英文?cgitb有两个方法可以调用。

1
2
3
4
5
cgitb.encable(display=1, logdir=None, context=5, format="html")
display: 1,发送至浏览器;0, 不发送
logdir: 错误日志保存目录
context: 显示错误代码周围的代码行数
format: 显示格式,除了'html',其余的都强制纯文本输出

打包程序异常退出

Pyinstaller等将Python程序打包成EXE可执行文件,但是打开就一闪而过,连错误都来不及看怎么办?

用命令行打开,就可以看到错误信息了。

按下Win+RWin键就是键盘上CtrlAlt之间的那个有Windows图标的按键。然后输入cmd,也就打开了命令行。输入:

1
2
3
start <你程序的完整路径>
例如:
start E:\QQ\Bin\QQ.exe

然后就可以看到报错信息了。