Почему эта глобальная переменная не найдена, если она определена в главной? - PullRequest
0 голосов
/ 12 сентября 2018

Я сделал этот простой скрипт, чтобы попробовать что-то. По сути, он должен перехватывать любые исключения, возникающие во время работы приложения, и отключаться от сервера.

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?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Причиной проблемы было то, что исключение вызывалось до того, как 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 голосов
/ 12 сентября 2018

Я думал, что 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_()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...