¿Cómo puedo hacer que las excepciones silenciosas sean más fuertes en tkinter?

Si ejecuto el siguiente código desde una terminal, recibo un mensaje de error útil en la terminal:

import Tkinter as tk

master = tk.Tk()

def callback():
    raise UserWarning("Exception!")

b = tk.Button(master, text="This will raise an exception", command=callback)
b.pack()

tk.mainloop()

Sin embargo, si lo ejecuto sin un terminal (por ejemplo, haciendo doble clic en un icono), el mensaje de error se suprime.

En mi aplicación Tkinter real y más complicada, me gusta que la GUI sea un poco resistente a los choques. No me gusta que mis usuarios tengan dificultades para darme comentarios útiles para corregir el comportamiento inesperado resultante.

¿Cómo debería manejar esto? ¿Existe una forma estándar de exponer trazas o stderror o cualquier otra cosa en una aplicación Tkinter? Estoy buscando algo más elegante que probar / excepto en todas partes.

EDITAR: Jochen Ritzel dio una excelente respuesta a continuación que muestra un cuadro de advertencia y mencionó adjuntarlo a una clase. Solo para hacer esto explícito:

import Tkinter as tk
import traceback, tkMessageBox

class App:
    def __init__(self, master):
        master.report_callback_exception = self.report_callback_exception
        self.frame = tk.Frame(master)
        self.frame.pack()
        b = tk.Button(
            self.frame, text="This will cause an exception",
            command=self.cause_exception)
        b.pack()

    def cause_exception(self):
        a = []
        a.a = 0 #A traceback makes this easy to catch and fix

    def report_callback_exception(self, *args):
        err = traceback.format_exception(*args)
        tkMessageBox.showerror('Exception', err)

root = tk.Tk()
app = App(root)
root.mainloop()

Mi confusión restante: Jochen menciona la posibilidad de tener diferentes funciones de informes de excepción en diferentes marcos. Todavía no veo cómo hacer eso. ¿Es esto obvio?

Respuestas a la pregunta(2)

Su respuesta a la pregunta