Como posso tornar as exceções silenciosas mais altas no tkinter?

Se eu executar o seguinte código em um terminal, recebo uma mensagem de erro útil no 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()

No entanto, se eu executá-lo sem um terminal (digamos, clicando duas vezes em um ícone), a mensagem de erro é suprimida.

No meu aplicativo Tkinter real e mais complicado, gosto que a GUI seja um pouco resistente a falhas. Não gosto que meus usuários tenham dificuldade em fornecer feedback útil para corrigir o comportamento inesperado resultante.

Como devo lidar com isso? Existe uma maneira padrão de expor rastreamentos ou stderror ou outros enfeites em um aplicativo Tkinter? Estou procurando algo mais elegante do que colocar try / exceto em todos os lugares.

Edição: Jochen Ritzel deu uma excelente resposta abaixo que aparece uma caixa de aviso e mencionou anexá-lo a uma classe. Apenas para tornar isso 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()

Minha confusão restante: Jochen menciona a possibilidade de ter diferentes funções de relatório de exceção em diferentes quadros. Ainda não vejo como fazer isso. Isso é óbvio?

questionAnswers(2)

yourAnswerToTheQuestion