如果在主变量中定义了该全局变量,为什么找不到呢?

时间:2018-09-12 14:06:51

标签: python exception-handling global-variables

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

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_()

如果在主程序中定义了变量,为什么错误处理程序找不到该变量?

2 个答案:

答案 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_()