gpt4 book ai didi

python - pyqt qthread 中的错误未打印

转载 作者:行者123 更新时间:2023-11-30 23:26:20 25 4
gpt4 key购买 nike

我无法从 QThread 获取(打印)错误信息。我有一个 worker (QThread):

class Worker(QThread):
def __init__(self, parent=None):
QThread.__init__(self, parent)

def run(self):
# do some heavy work here
print 1 # 1 is printed in my OutputWidget
print a # a is not defined and it should print an error

如果我仅运行新文件中的最后一行(print a)(其中未定义a),则会收到错误(这是正确的且符合预期):

Traceback (most recent call last):
File "C:\...\output_widget\output_from_qthread_V2.py", line 1, in run
print a
NameError: global name 'a' is not defined

输出小部件:

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore

from output_widget_ui import Ui_Form

class TextOutputSignal(QtCore.QObject):
textWritten = QtCore.pyqtSignal(str)
def write(self, text):
self.textWritten.emit(str(text))

class OutputWidget(QtGui.QWidget):

def __init__(self, parent=None, flags=0):
super(OutputWidget, self).__init__(parent)
sys.stdout = TextOutputSignal(textWritten=self.normalOutputWritten)

self.ui = Ui_Form()
self.ui.setupUi(self)

def __del__(self):
# Restore sys.stdout
sys.stdout = sys.__stdout__

def normalOutputWritten(self, text):
cursor = self.ui.textOutputWidget.textCursor()
cursor.movePosition(QtGui.QTextCursor.End)
cursor.insertText(text)
self.ui.textOutputWidget.ensureCursorVisible()

我想知道为什么错误没有打印在 OutputWidget 中,也没有打印在控制台中(使用 eclipse)?我该如何解决这个问题?

最佳答案

您首先需要在线程中使用一个捕获所有异常的子句,否则您的异常(来自不存在的全局异常)将未被捕获并导致线程和应用程序退出。然后,从该包罗万象中,您调用 sys.exc_info() 来获取回溯信息,并调用 sys.excepthook() 来获取回溯信息。这会将回溯发送到 stderr(而不是 stdout)。因此尝试 OutputWidget:

def __init__(...):
...
sys.stdout = TextOutputSignal(textWritten=self.normalOutputWritten)
sys.stderr = TextOutputSignal(textWritten=self.errorOutputWritten)
...

def errorOutputWritten(self, text):
self.normalOutputWritten("*** ERROR: " + text)

对于你的工作线程:

class Worker(QThread):
...

def run(self):
try:
# do some heavy work here
print 1 # 1 is printed in my OutputWidget
print a # a is not defined and it should print an error
except:
(type, value, traceback) = sys.exc_info()
sys.excepthook(type, value, traceback)
...decide if should exit thread or what...

在上面,异常将导致线程正常退出,并且您将在控制台中看到错误。一般来说,您还需要向主线程发出一些错误状态信号,以便应用程序可以确定要做什么:向用户显示网络连接丢失的错误等,并且应用程序必须决定是否应该退出,保存工作,任何。

请注意,如果您想要直接处理几个特定的​​异常,例如除以 0 或 NameError,则可以直接捕获,并保留真正的异常情况(意外情况)的全部捕获。异常(exception)):

    def run(self):
try:
# do some heavy work here
print 1 # 1 is printed in my OutputWidget
print a # a is not defined and it should print an error
except NameError, exc:
sys.stderr.write( "Name Error\n" );
...decide if should exit thread or what...
except:
(type, value, traceback) = sys.exc_info()
sys.excepthook(type, value, traceback)
...decide if should exit thread or what...

关于python - pyqt qthread 中的错误未打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22581496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com