Pregunta

Tengo una aplicación wxPython que se basa en un archivo de configuración externo. Quiero proporcionar diálogos de mensajes amigables que aparezcan si hay algún error de configuración. He intentado hacer que esto funcione envolviendo mi aplicación. La llamada MainLoop () en una declaración try / except.

El siguiente código funciona para el código de inicio en mi clase de marco MainWindow, pero no detecta ninguna excepción que ocurra dentro del MainLoop. ¿Cómo puedo detectar estas excepciones también?

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

He leído alguna mención de un método OnExceptionInMainLoop que se puede anular en la clase wx.App, pero la fuente que leí debe estar desactualizada (2004), ya que wx.App ya no parece tener un método. nombre.

EDIT:

Necesito poder detectar las excepciones no manejadas durante mi mainloop para poder manejarlas y mostrarlas en diálogos de error, no pasarlas en silencio y no terminar la aplicación.

La solución sys.excepthook tiene un nivel demasiado bajo y no funciona bien con el hilo wxPython mainloop. Mientras que el enlace a la otra respuesta hace lo mismo, intenta / excepto envolver el mainloop que no funciona, una vez más, para que wxPython genere un hilo diferente para la aplicación / ui.

¿Fue útil?

Solución

Codifiqué algo como esto para Chandler , donde cualquier excepción no controlada aparece una ventana con la pila y otra información , y los usuarios pueden agregar comentarios adicionales (qué hicieron cuando sucedió, etc.) y enviarlos a los desarrolladores de Chandler. Un poco como el Respuesta de Mozilla ( en la actualidad ellos usan el Breakpad, creo) característica, si lo desean.

Para hacer esto en wxPython, debe proporcionar un parámetro de redireccionamiento a wx.App. Esto abrirá wx.PyOnDemandOutputWindow (probablemente querrá para anularlo para proporcionar una implementación de mejor aspecto).

Los archivos fuente relevantes en Chandler están aquí:

  • Chandler.py inicia la aplicación y establece el atributo de redireccionamiento , así como también intenta detectar y mostrar diálogos de error en caso de que el inicio normal de la aplicación falle
  • Application.py personaliza el objeto de la aplicación, incluido configurando nuestra wx.PyOnDemandOutputWindow personalizada
  • feedback.py tiene la implementación para el personalizado wx.PyOnDemandOutputWindow; además, necesitará feedback.xrc y feedback_xrc.py

Otros consejos

No sé si esto funcionará para una aplicación wxPython, pero en el módulo sys puede sobrescribir el atributo excepthook, que es una función llamada con 3 argumentos, (tipo, valor, rastreo) , cuando se captura una excepción de no captura. Puede instalar su propia función allí que maneja solo las excepciones que desea, y llamar a la función original para todas las demás.

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

Quizás esta pregunta puede ser de alguna utilidad, intenta capturar todas las excepciones.

Publicar la solución que me funcionó con un problema muy similar.

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

Usar sys.excepthook es muy bueno para mí.

Encuentro el siguiente artículo de gran ayuda: wxPython: captura de excepciones desde cualquier lugar .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top