Domanda

Ho un'applicazione wxPython che si basa su un file di configurazione esterno. Voglio fornire dialoghi amichevoli che mostrino se ci sono errori di configurazione. Ho provato a farlo funzionare avvolgendo la mia app.MainLoop () in un'istruzione try / tranne.

Il codice seguente funziona per il codice init nella mia classe di frame MainWindow, ma non rileva alcuna eccezione che si verifica all'interno di MainLoop. Come posso cogliere anche queste eccezioni?

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

Ho letto qualche menzione di un metodo OnExceptionInMainLoop che può essere sovrascritto nella classe wx.App, ma l'origine che ho letto deve essere obsoleta (2004) poiché wx.App sembra non avere più un metodo con quello nome.

Modifica

Devo essere in grado di rilevare le eccezioni non gestite durante il mio mainloop in modo da poterle gestire ulteriormente e visualizzarle in finestre di dialogo di errore, non passare silenziosamente e non terminare l'app.

La soluzione sys.excepthook è di livello troppo basso e non funziona bene con il thread mainloop di wxPython. Mentre il collegamento all'altra risposta fa lo stesso tentativo / tranne che avvolge il mainloop che non funziona a causa, ancora una volta, di wxPython che genera un thread diverso per l'app / l'interfaccia utente.

È stato utile?

Soluzione

Ho codificato qualcosa del genere per Chandler , dove eventuali eccezioni non gestite fanno apparire una finestra con lo stack e altre informazioni e gli utenti possono inserire commenti aggiuntivi (cosa hanno fatto quando è successo, ecc.) e inviarlo agli sviluppatori Chandler. Un po 'come il Mozilla Talkback ( oggigiorno usano la funzione Breakpad credo) se vuoi.

Per fare ciò in wxPython, è necessario fornire il parametro di reindirizzamento a wx.App. Verrà visualizzato wx.PyOnDemandOutputWindow (probabilmente vorrai per sovrascriverlo per fornire un'implementazione dall'aspetto più gradevole).

I file sorgente rilevanti in Chandler sono qui:

  • Chandler.py avvia l'applicazione e imposta l'attributo di reindirizzamento , oltre a cercare di visualizzare e visualizzare finestre di dialogo di errore nel caso in cui il normale avvio dell'applicazione non riesca
  • Application.py personalizza l'oggetto dell'applicazione, incluso impostazione della nostra finestra personalizzata wx.PyOnDemandOutputWindow
  • feedback.py ha l'implementazione per il personalizzato wx.PyOnDemandOutputWindow; avrà inoltre bisogno di feedback.xrc e feedback_xrc.py

Altri suggerimenti

Non so se funzionerà con un'applicazione wxPython, ma nel modulo sys puoi sovrascrivere l'attributo excepthook, che è una funzione chiamata con 3 argomenti, (tipo, valore, traceback) , quando viene rilevata un'eccezione di uncaugth. Puoi installare lì la tua funzione che gestisce solo le eccezioni che desideri e chiamare la funzione originale per tutte le altre.

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

Forse questa domanda potrebbe essere di qualche utilità, cerca di catturare tutte le eccezioni.

Pubblicando la soluzione che ha funzionato per me con un problema molto simile.

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

L'uso di sys.excepthook mi sta benissimo.

Trovo il seguente articolo di grande aiuto: wxPython: catturare le eccezioni da qualsiasi luogo .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top