我制作了这个简单的脚本来尝试一些东西。基本上,它应该捕获在应用程序运行期间发生的任何异常并与服务器断开连接。
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_()
如果在主程序中定义了变量,为什么错误处理程序找不到该变量?
答案 0 :(得分:1)
问题的原因是在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_()
答案 1 :(得分:0)
我认为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_()