Exception auf oberste Ebene abfangen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
twessels
User
Beiträge: 22
Registriert: Freitag 21. Januar 2011, 13:05

Hallo,

wenn in meiner PyQt-Anwendung ein Fehler auftritt sieht man diesen i.d.R nicht, da nur die Gui sichbar. Es sei denn, man startet das Programm von der Konsole aus.
Ich würde das gerne so ändern, dann meine Gui bei einem Programmabsturz den Fehler in einem Fenster anzeigt, sodass der Benutzer sieht wo was schiefgegangen ist.

Wo fange ich sowas am besten ab?
Hatte das in etwa so gedacht:

Code: Alles auswählen

if __name__ == "__main__":
	app = QApplication(sys.argv)
	
	try:
		gui = Gui()
		loadStyleSheet()
		gui.show()
		app.exec_()
	except Exception, e:
		gui.showError(str(e))

Falls 'gui' dann überhaupt noch existiert
Wie fangt ihr in einer graphischen Anwendung unvorhersehbare Fehler ab?
lunar

@twessels: Python-Ausnahmen werden nicht durch die Qt-Ereignisschleife durchgereicht. Versuche, "sys.excepthook" zu überschreiben.
twessels
User
Beiträge: 22
Registriert: Freitag 21. Januar 2011, 13:05

@lunar
Mega gut! Vielen Dank für den Hinweis

Code: Alles auswählen

def info(type, value, tb):
	global gui
	
	rawreport = traceback.format_exception(type, value, tb)
	report = '\n'.join(rawreport)
	logging.error(report)
	print report
	
	numTab = gui.newTab("Tracer")
	gui.changeActiveTab(numTab)
	gui.updateTab(numTab, str(report), myout['ext'])

if __name__ == "__main__":
	app = QApplication(sys.argv)
	
	# overwrite function which prints out a given traceback and exception
	sys.excepthook = info
	
	# instanciate class Gui
	global gui
	gui = Gui()
	
	# customize look & feel
	loadStyleSheet()
	
	# show window
	gui.show()
	
	# enter event loop
	app.exec_()

lunar

@twessels: "global" würde ich loswerden. Du kannst "info" auch in "Gui" implementieren, und dann "sys.excepthook = gui.info" nutzen.
Antworten