如果在主要变量中定义了这个全局变量,为什么不能找到?

问题描述 投票:1回答:2

我制作了这个简单的脚本来尝试一些东西。基本上,它应该捕获在运行应用程序期间发生的任何异常并断开与服务器的连接。

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中定义?

python exception-handling global-variables
2个回答
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_()

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_()
© www.soinside.com 2019 - 2024. All rights reserved.