我制作了这个简单的脚本来尝试一些东西。基本上,它应该捕获在运行应用程序期间发生的任何异常并断开与服务器的连接。
import sys
import traceback
from PyQt5.QtWidgets import *
class Window(QWidget):
def __init__(self):
QWidget.__init__(self)
layout = QVBoxLayout()
self.setLayout(layout)
# Generate exception
raise Exception('Oh no!')
def foo(self):
print('Bar')
def error_handler(etype, value, tb):
global ex
error_msg = ''.join(traceback.format_exception(etype, value, tb))
print(error_msg)
ex.foo()
sys.exit(1)
if __name__ == '__main__':
sys.excepthook = error_handler
app = QApplication([])
ex = Window()
ex.show()
app.exec_()
为什么错误处理程序找不到变量,如果它在main中定义?
问题的原因是在将ex
分配给任何东西之前提出异常。
如果在定义ex
之前需要处理异常,则处理程序不需要假设它可以使用ex
。
处理它的一种简单方法可能是在准备好之前将ex
设置为None
,并在处理程序中检查它。
def error_handler(etype, value, tb):
error_msg = ''.join(traceback.format_exception(etype, value, tb))
print(error_msg)
if ex: # Check if ex is ready
ex.foo()
sys.exit(1)
if __name__ == '__main__':
ex = None
sys.excepthook = error_handler
app = QApplication([])
ex = Window()
ex.show()
app.exec_()
我认为error_handler
是在你定义ex
之前执行的。因为我试过这个:
def function():
global hello
print(hello)
if __name__ == '__main__':
func = function
hello = "world"
func() #world
所以你需要在使用之前定义ex
:
if __name__ == '__main__':
ex = Window() #defined it first
sys.excepthook = error_handler
app = QApplication([])
ex.show()
app.exec_()