Frage

Ich habe eine WXPython -Anwendung, die auf einer externen Konfigurationsdatei beruht. Ich möchte freundliche Nachrichtendialoge angeben, die angezeigt werden, wenn Konfigurationsfehler vorliegen. Ich habe versucht, diese Arbeit zu machen, indem ich meine App.mainloop () -Anruf in eine Versuch/außer Anweisung einwickelte.

Der folgende Code funktioniert für den Init -Code in meiner MainWindow -Frame -Klasse, fängt jedoch keine Ausnahmen auf, die in der Hauptloop auftreten. Wie kann ich auch diese Ausnahmen fangen?

if __name__ == '__main__':
    app = MyApp(0)
    try:
        MainWindow(None, -1, 'My Cool App')
        app.MainLoop()
    except ConfigParser.Error, error_message:
        messagebox = wx.MessageDialog(None, error_message, 'Configuration Error', wx.OK | wx.ICON_ERROR)
        messagebox.ShowModal()

Ich habe einige Erwähnung einer OnexceptionInMainloop -Methode gelesen, die in der WX.App -Klasse überschrieben werden kann. Die Quelle, die ich gelesen habe, muss jedoch veraltet sein (2004), da WX.App keine Methode mit diesem Namen zu haben scheint.

BEARBEITEN:

Ich muss in der Lage sein, uneingeschränkte Ausnahmen während meiner Hauptfrequenz zu fangen, damit ich sie weiter verarbeiten und in fehlerhaften Dialogen anzeigen, nicht stillschweigend übergeben und die App nicht beenden kann.

Die SYS.Excepthook -Lösung ist zu niedrig und spielt mit dem WXPython -Mainloop -Thread nicht gut. Während der Link zur anderen Antwort das gleiche Versuch/Außer der Wickel des Hauptloops, der nicht fällig funktioniert, um WXPython zu verbringen, um einen anderen Thread für die App/die Benutzeroberfläche zu laichen.

War es hilfreich?

Lösung

Ich habe so etwas codiert für Chandler, wo unbehandelte Ausnahmen ein Fenster mit dem Stapel und anderen Informationen auftreten und Benutzer zusätzliche Kommentare eingeben können (was haben sie getan, als es passiert ist usw.) und es für Chandler -Entwickler einreichen. Ein bisschen wie das Mozilla Talkback (heutzutage Sie verwenden die Breakpad -Funktion), wenn Sie so wollen.

Um dies in WXPython zu tun, müssen Sie einen Umleitungsparameter zu WX.App bereitstellen. Dies wird auftauchen wx.pyondemandoutputWindow (Sie möchten es wahrscheinlich außer Kraft setzen, um eine schönere Implementierung bereitzustellen.)

Die relevanten Quelldateien in Chandler sind hier:

  • Chandler.py Startet die Anwendung und legt das Ausleitungsattribut fest, sowie Versuche, Fehlerdialoge zu fangen und anzeigen, falls normales Anwendungsstart fehlschlägt
  • Application.py Passen Sie das Anwendungsobjekt an, einschließlich der Einrichtung unseres angepassten WX.PyondemandoutputWindows
  • Feedback.py hat die Implementierung für das individuelle WX.PyondemandoutputWindow; Es benötigt zusätzlich feedback.xrc und feedback_xrc.py

Andere Tipps

Ich weiß nicht, ob dies für eine WXPython -Anwendung funktioniert, aber im SYS -Modul können Sie das Attribut außerhalb des Aussagens überschreiben, bei dem es sich um eine Funktion handelt, die mit 3 Argumenten bezeichnet wird. (type, value, traceback), wenn eine ungewöhnliche Ausnahme erwischt wird. Sie können dort Ihre eigene Funktion installieren, die nur die gewünschten Ausnahmen übernimmt, und die ursprüngliche Funktion für alle anderen aufrufen.

Konsultieren: http://docs.python.org/library/sys.html#sys.excepthook

Vielleicht Dies Die Frage könnte von irgendeiner Verwendung sein, es versucht, alle Ausnahmen zu erfassen.

Veröffentlichen Sie die Lösung, die für mich mit einem sehr ähnlichen Problem funktioniert hat.

import wx
import sys
import traceback

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        panel = wx.Panel(self)
        m_close = wx.Button(panel, -1, "Error")
        m_close.Bind(wx.EVT_BUTTON, self.OnErr)
    def OnErr(self, event):
        1/0

def handleGUIException(exc_type, exc_value, exc_traceback):
    err_msg = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
    err_msg += '\n Your App will now terminate'
    # Here collecting traceback and some log files to be sent for debugging.
    # But also possible to handle the error and continue working.
    dlg = wx.MessageDialog(None, err_msg, 'Termination dialog', wx.OK | wx.ICON_ERROR)
    dlg.ShowModal()
    dlg.Destroy()
    sys.exit()

sys.excepthook = handleGUIException

if __name__ == '__main__':
    app = wx.App(redirect=False) 
    top = Frame()
    top.Show()
    app.MainLoop()

Verwendung sys.excepthook ist sehr gut für mich.

Ich finde den folgenden Artikel mit großer Hilfe: WXPYTHON: Ausnahmen von überall aufnehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top