On Wednesday 17 January 2007 14:23, Jim Bublitz wrote: > On Wednesday 17 January 2007 09:22, Joseph Rawson wrote: > > I do have a quick question. Is it possible to display a > > KMessageBox.error on any exception that is raised while the application > > loop is running? I know that I can make my own exception classes and > > have them make the dialogs, but this only helps when I expect an error. > > Look at sys.excepthook in the sys module in the Python Library Reference > docs.. Define an exception handler: > > # 3 arguments required > def yourExceptionHandler (a,b,c): > print "*** got exception ***" > > and beofre starting the event loop do: > > sys.excepthook = yourExceptionHandler > > The sys..excepthook method (which is now pointed to "yourExceptionHandler") > gets all unhandled exceptions. > > You could, for example, define a method that pops up the KMessageBox as > part of your KMainWindow subclass, and then call that method from > "yourExceptionHandler". > > An easy test is to define a button that attempts division by zero when > clicked - "yourExceptionHandler" should get called when you click the > button, and whatever you code that to do should then happen. > > Jim > > > > _______________________________________________ > PyKDE mailing list [email protected] > http://mats.imk.fraunhofer.de/mailman/listinfo/pykde Hey, that works great! I've been programming in python for quite a while, but never bothered with digging around the sys module very much. It took me a little while to figure out how to print it all out. Here is what I came up with:
import traceback
from StringIO import StringIO
from kdeui import KMessageBox
separator = '-' * 80
def excepthook(type, value, tracebackobj):
tbinfofile = StringIO()
traceback.print_tb(tracebackobj, None, tbinfofile)
tbinfofile.seek(0)
tbinfo = tbinfofile.read()
sections = [str(type), str(value), separator, tbinfo, separator]
msg = '\n'.join(sections)
KMessageBox.error(None, msg)
and in the main script:
from 'module' import excepthook
sys.excepthook = excepthook
... then __main__
app = myapp()
app.exec_loop()
It seems to work pretty good. I'll pretty up the message box later, but this
works quite well for now.
Thanks :)
--
Joseph Rawson
(oops, didn't reply to list)
pgpOM9WZCuUWl.pgp
Description: PGP signature
_______________________________________________ PyKDE mailing list [email protected] http://mats.imk.fraunhofer.de/mailman/listinfo/pykde
