← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~raoul-snyman/openlp/except-hook into lp:openlp

 

Raoul Snyman has proposed merging lp:~raoul-snyman/openlp/except-hook into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)


Added a simple dialog to display any uncaught exceptions. This should give the user some feedback when a behind-the-scenes exception occurs, and provides us with a way to get tracebacks from users.
-- 
https://code.launchpad.net/~raoul-snyman/openlp/except-hook/+merge/34832
Your team OpenLP Core is requested to review the proposed merge of lp:~raoul-snyman/openlp/except-hook into lp:openlp.
=== modified file 'openlp.pyw'
--- openlp.pyw	2010-09-04 20:08:36 +0000
+++ openlp.pyw	2010-09-08 04:58:38 +0000
@@ -29,12 +29,14 @@
 import sys
 import logging
 from optparse import OptionParser
+from traceback import format_exception
 
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import Receiver
 from openlp.core.resources import qInitResources
 from openlp.core.ui.mainwindow import MainWindow
+from openlp.core.ui.exceptionform import ExceptionForm
 from openlp.core.ui import SplashScreen, ScreenList
 from openlp.core.utils import AppLocation, LanguageManager, VersionThread
 
@@ -144,6 +146,13 @@
         VersionThread(self.mainWindow, app_version).start()
         return self.exec_()
 
+    def hookException(self, exctype, value, traceback):
+        if not hasattr(self, u'exceptionForm'):
+            self.exceptionForm = ExceptionForm(self.mainWindow)
+        self.exceptionForm.exceptionTextEdit.setPlainText(
+            ''.join(format_exception(exctype, value, traceback)))
+        self.exceptionForm.exec_()
+
 def main():
     """
     The main function which parses command line options and then runs
@@ -194,7 +203,7 @@
     language = LanguageManager.get_language()
     appTranslator = LanguageManager.get_translator(language)
     app.installTranslator(appTranslator)
-
+    sys.excepthook = app.hookException
     sys.exit(app.run())
 
 if __name__ == u'__main__':

=== modified file 'openlp/core/resources.py'
--- openlp/core/resources.py	2010-07-24 22:10:47 +0000
+++ openlp/core/resources.py	2010-09-08 04:58:38 +0000
@@ -6,9 +6,8 @@
 # --------------------------------------------------------------------------- #
 # Copyright (c) 2008-2010 Raoul Snyman                                        #
 # Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael      #
-# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian      #
-# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble,    #
-# Carsten Tinggaard, Frode Woldsund                                           #
+# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin      #
+# Thompson, Jon Tibble, Carsten Tinggaard                                     #
 # --------------------------------------------------------------------------- #
 # This program is free software; you can redistribute it and/or modify it     #
 # under the terms of the GNU General Public License as published by the Free  #
@@ -42314,6 +42313,115 @@
 \x4f\xaa\x6c\xce\x56\xa7\x3f\x37\xcb\x3a\xf8\x3f\x3e\x75\x3a\xbb\
 \x8c\x9a\xb6\x26\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
 \
+\x00\x00\x06\xad\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\x76\x00\x00\x03\x76\
+\x01\x7d\xd5\x82\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\
+\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x06\x2a\x49\x44\
+\x41\x54\x78\xda\xc5\x57\x7b\x4c\x93\x57\x14\xbf\xb4\xa5\xef\x77\
+\xe9\x83\x52\xa0\x1f\x6d\x11\x69\x29\x53\x40\x5b\x11\xa6\x18\x74\
+\x02\x3a\x94\x49\xd4\x0d\x11\xe3\x4c\xa6\xc4\xcd\xa1\xd3\x85\x29\
+\x59\xb2\xcd\x91\x19\x03\x19\x3a\x23\x9b\x6e\x1a\x66\x82\xd9\xd4\
+\x8d\x44\x81\xb8\x38\x1f\x30\xdd\x2b\xbe\x75\xa2\x2c\x6e\xce\x49\
+\x34\x3a\xd4\x4c\x51\x39\xfb\xdd\x46\xfe\x59\x00\x15\x9b\xd8\xe4\
+\xc7\xfd\xee\xfd\xce\xbd\xe7\x77\xcf\xf9\xdd\x73\x3f\x18\x11\x3d\
+\x53\x3c\xd2\x00\x3f\x91\x5c\x2e\x17\xd0\x46\x3e\xee\xa2\xf8\x69\
+\xf8\x9c\x70\x11\x90\x68\x34\x9a\x0f\xd0\xaa\x9e\x80\x40\x34\xe6\
+\xac\x08\x0b\x01\x0e\xb3\xd9\x3c\x0f\x0b\x2e\x9d\xc4\xd8\x22\xbe\
+\xbb\x81\xec\xb2\x19\x1b\x13\x64\x6c\x94\x56\xab\xdd\xac\x54\x2a\
+\xd3\xc3\x46\x00\x3f\x83\xcb\xe5\xaa\x1f\xcf\x58\x71\x11\x63\xe5\
+\xe8\xcb\xfa\xb1\xd1\x2d\x60\x6c\xab\x99\x31\x4f\x6c\x6c\xec\x06\
+\xf4\xa5\xe1\x24\x20\x31\x18\x0c\xeb\x54\x2a\x95\x3f\x8b\xb1\x91\
+\x65\x0a\x45\xb9\x89\xb1\x52\x9b\xcd\x96\xac\xd3\xe9\x5c\x29\x8c\
+\xcd\x9d\xce\xd8\xc2\x0c\x95\xca\x86\x48\x4d\x45\x04\x56\x61\x4e\
+\x44\x38\x09\xa8\x05\x41\xe8\xc4\xe2\x05\x7c\xa7\x32\x69\xc4\x9e\
+\xd2\x42\xe3\x49\x87\x3d\xea\x5f\x8f\x60\xea\x2e\xce\x51\x9e\xc4\
+\x78\x03\x20\xb5\xdb\xed\xcb\x1d\x0e\xc7\x6e\x2e\xda\xb0\x11\x30\
+\x1a\x8d\xb1\x3e\x9f\xaf\x0d\x8b\x9a\x9a\xb6\xe7\x1d\xfe\x68\xa5\
+\x70\x27\x2b\x60\x25\x85\x42\x4e\x6a\x95\x9c\x52\xbd\x51\xb4\x7a\
+\xa1\xb8\x7b\x53\x8d\xf0\x2d\x6c\x1d\x99\x99\x99\xed\x9c\x74\xd8\
+\x08\x44\x45\x45\x45\x7b\xbd\xde\xb5\x5b\xeb\xec\x07\x7a\xbb\x86\
+\xd3\xa6\x5a\x23\x39\x9d\xce\x10\xa2\xa3\xa3\x49\xaf\xd7\xd3\x92\
+\x22\x31\xfd\xf1\x8b\x96\x56\x57\xc6\x34\xe6\xe6\xe6\xd6\x81\x80\
+\x32\x9c\x29\x90\x43\x03\x0d\xef\xcf\x17\xf7\xa6\xf9\xf4\x14\x1f\
+\x1f\x4f\xf5\xf5\xf5\x54\x5d\x5d\x1d\x7a\x06\x41\x44\x43\x41\x12\
+\x31\xa3\xb7\x4b\xd8\x3d\xbf\xdf\xbf\x86\xd7\x8f\x70\x12\x88\x00\
+\x36\xcb\x64\x32\x32\x99\x4c\x21\xa7\x35\x35\x35\x54\x55\x55\x45\
+\x71\x71\x71\xa1\x31\x14\x1e\x6e\xd8\x87\x35\xe1\xac\x84\x52\x88\
+\xaf\xac\x42\xa1\xde\x5e\x6a\x32\xf7\x16\x58\x6d\x54\x98\x26\xd0\
+\x94\xac\x61\x34\xd2\x9b\x48\x23\xbc\x2e\xca\x0f\x3a\x29\x37\xc9\
+\x4e\x05\x46\x23\xbd\xa6\x37\xde\x2f\x97\x29\x3f\x01\x59\xf7\x53\
+\x13\xe0\x61\x84\xf3\x8a\x09\x6a\xdd\xf5\xc3\x22\x4d\x6f\x27\x13\
+\xd3\xdf\x98\x72\x23\x5e\x4d\xbf\x1f\x9a\x4a\x63\x33\x03\x34\x26\
+\x18\xa0\xd6\xcf\x5e\xa0\x7f\xec\x7a\xba\xca\x18\xde\x8b\xe8\x34\
+\x53\xf6\x8e\x8d\xb2\x9e\xc6\x71\xcc\x78\xd4\x71\x1c\xcc\x79\x24\
+\xce\xfd\x44\x8b\xc5\x72\xb3\x55\xa4\xbd\x7c\x1e\x0b\x5f\x82\xf9\
+\x35\xe0\x3a\x72\x9e\xe7\xf7\x53\x6a\x6a\x2a\x65\x64\x64\x50\x26\
+\xda\x1b\x42\x02\xdd\x50\xa9\xa9\x0b\xef\x2f\xca\x14\xb4\x5f\xa4\
+\x39\x97\x92\x92\x72\x02\x6b\xa4\x3c\x11\x01\x1e\x72\x94\xd1\xc9\
+\x28\x30\xd5\x6e\xb7\xfb\xd3\x77\x64\xba\x8d\xcb\x1c\xf1\xb4\xc9\
+\x62\xc1\xee\xe0\x1c\xb9\xbe\xbb\xec\x2d\x7a\xa3\xa4\x84\x92\x92\
+\x92\x08\x82\xa3\xe1\x68\x6f\xa5\xa5\xd3\xcd\x68\x7b\x88\x60\xa3\
+\xdb\x4d\xbb\x62\x5d\x0f\x2a\xa4\xda\x55\x31\x31\x31\x6b\x13\x13\
+\x13\xeb\xa0\x95\x09\x8f\x24\xc0\x43\xce\x1d\x43\x54\xef\xf1\x33\
+\x0f\x28\x6a\xd4\xa6\x53\x38\x82\x34\xce\xe5\xa2\x3f\x25\x12\xea\
+\x16\x04\xba\xbf\x73\x27\x75\x6c\xd9\x42\x53\x12\x3d\x34\x33\x30\
+\x8a\x6a\xb3\x32\xa9\x67\x6c\x16\xdd\x76\x0a\x74\x5a\x26\xa7\xe4\
+\xe4\x64\x5a\x90\x9d\x4d\xcd\x2a\xd3\x3e\x5e\x0f\x90\x8a\xd1\x28\
+\x50\xeb\xb1\xee\x07\x3c\x25\x83\x46\x00\xe2\x71\xf1\xd2\xfb\x90\
+\x90\xbe\xd2\x64\xfe\xcb\xe3\xf1\x50\x16\xd4\x7e\x85\xe7\x5f\xad\
+\xa6\x3b\xf9\x05\x74\x65\xdc\x38\x6a\x4e\xf1\xd2\xd1\xe2\x69\xd4\
+\x53\x38\x95\x7a\x82\x99\x74\x2b\x2e\x9e\xae\x8a\x44\x94\x0e\x5b\
+\x14\x2e\xfa\xce\x33\xfc\xd7\xbe\x5b\x14\x3f\x3b\x60\x7b\x52\x11\
+\x5a\x57\xc5\x0b\xb7\x9f\xc3\x82\x5f\xe2\x9c\x5f\x86\x79\x97\x58\
+\x42\x37\x1d\xb1\x74\x29\x71\x18\x35\x27\x24\xd0\x99\x9c\x1c\xea\
+\xc9\x7e\x9e\xba\x92\x7d\xd4\x0d\x6d\x70\x21\x6e\x00\x49\x01\x91\
+\x6a\x4d\xf1\x5f\xc4\x1a\xc6\x21\x9f\x82\x34\xc6\x5c\x3f\xba\xdd\
+\xbd\x67\x23\x22\xa8\x35\x32\x92\xf2\x71\xcc\xe2\xcc\x66\x9a\x69\
+\x30\x52\x1b\xda\xdd\x66\x0b\x75\xf8\x53\x69\x3b\x42\x1f\x83\x7e\
+\x3a\x08\x70\xbb\xe3\x88\x42\x03\x08\x9f\x1f\x1d\xb8\x05\x02\x51\
+\x43\x26\x30\xd7\x60\x48\x39\x04\x85\x1f\x07\x81\x8d\x10\x1f\xaf\
+\x78\x46\x90\x70\xe9\x74\x54\x09\x07\x4d\xc8\xf7\x09\x88\xd3\x81\
+\x52\x8c\x4a\x19\x7a\x97\x80\xa2\xd4\x89\x65\x3b\x61\x73\x2a\x3b\
+\xbb\xc7\xc6\x98\xf9\x69\xea\x80\xa1\x65\x44\xda\xb5\x36\x8d\x86\
+\x1a\x21\x40\x5e\xf3\x21\x52\x4a\x44\x88\x97\x4a\xa5\xb4\x0b\xd3\
+\xcf\xa1\x3a\x46\xa3\x0f\xa1\x85\xde\xd9\x80\x0b\x18\x3f\x0b\xdd\
+\xb4\x05\x82\x1d\x5c\x84\x4f\x43\x40\xd9\xe0\xf3\x1d\x69\xb6\xdb\
+\xe9\x20\x4c\x17\xc3\x99\x01\xce\x66\xc1\xf9\x01\x44\xe5\x2b\x8c\
+\x9d\xc1\x58\x09\xfa\x38\xef\x64\x03\x56\xa2\x7f\x12\xe3\x3f\x07\
+\x02\xb4\xd3\xe7\xdb\xc3\x8f\xf5\x90\x09\xe0\x82\x09\xce\x8e\x8b\
+\xfb\xbe\x11\xbb\xc1\x6e\x43\x24\x8e\x03\xe7\x80\xa3\x40\x23\xf0\
+\x1b\x1c\x5e\xe0\xcf\xc8\xfb\x36\x00\xb2\xa7\xbd\xc0\x3e\x88\xf3\
+\x15\xab\x75\x07\x08\x68\x87\x42\xa0\xaf\x26\x6c\xc8\x53\x6a\xab\
+\x2a\xa1\x83\x02\xec\xb2\x16\xbb\x6e\xc1\x94\x76\xe0\x10\xd0\x00\
+\x9c\x02\x81\x63\x68\x7f\x02\xf6\x03\x75\x20\x31\x1e\x63\x0d\x59\
+\xd9\xf7\x05\xa3\xb1\x05\xba\x98\x3f\x54\x02\x72\x14\x8f\x46\xb4\
+\xc6\x02\xa7\x70\x99\xe7\xd8\x02\x85\xd7\x62\xca\xd7\xc0\x0e\x60\
+\x3d\x08\xed\xc6\x58\xd3\xc3\xb1\x8f\x01\x25\x9c\x5b\x70\x22\x2a\
+\x04\xcf\x0f\xdc\xb9\xd5\x6a\xe5\x6b\x88\x87\x42\x40\x8f\xf2\x79\
+\x04\xad\xa2\x88\xc9\xca\xfd\x0e\x47\x28\xcf\x39\xd8\xe1\x3a\x4c\
+\x9b\x0f\xe7\xaf\xe3\xb9\x1c\x04\x96\xa0\x5f\x03\xcc\xc0\x58\x24\
+\xfa\x79\x4e\xe7\x83\x62\xb1\xb2\x10\x95\xef\x45\x7c\x9e\xf1\x35\
+\xa4\x43\x21\xe0\xc0\x45\xc4\x55\x6c\x06\xe4\x45\x11\xd2\xf6\x04\
+\x38\x9c\x04\x27\x55\xdc\x19\x30\x19\xcf\x6e\x38\x9c\x83\xe7\xa5\
+\x40\x31\xfa\x41\x9d\x9e\x66\x89\x15\x4d\xbc\x9a\x62\xf7\xf3\xf0\
+\xed\xb0\x77\xb0\xef\xc3\x81\x9c\xcb\x50\xcf\xdf\xc5\xe7\xf5\x17\
+\x10\x62\x1c\x1f\x4b\x60\x4c\x37\x9d\x45\x1e\x29\xc3\x94\x37\x81\
+\x15\xc0\x62\x38\x5c\x04\x6d\x2c\xe0\x11\x01\x4a\x51\xe6\x8b\x58\
+\x64\x6b\xdf\xd1\xc3\x57\x73\x19\xb0\x0d\x55\x71\xe2\x40\x69\xe8\
+\xcf\xb9\x06\xdf\x7a\xab\x81\x0f\xff\x5f\x46\x1d\xe8\xe7\x32\x71\
+\xfb\x1c\x26\xba\xb7\x08\x53\x5f\x05\x5e\x46\xce\x5f\x42\x9b\xcf\
+\x44\x77\x73\x98\xb8\xa5\xcf\x79\x9f\x90\xd5\x6a\xb5\x17\xb7\xe1\
+\xe7\xb8\x9a\x67\xf7\x97\x8a\xfe\x8e\xde\x34\x4c\x9a\x31\x20\x63\
+\x44\x27\xc8\xd8\x24\x84\xff\x60\xbe\x48\xd4\x31\x5a\x22\x39\x96\
+\xca\xd8\x37\xb1\x8c\xa5\xf3\x50\x0f\x34\x07\x57\xfb\x72\x5c\xcd\
+\x89\x8f\x13\x01\x51\x9f\xf3\xc1\xc0\x6d\x00\x09\xc7\xe3\xfc\x13\
+\x32\x90\x1d\xff\xf3\x4c\xf1\x1f\xa2\x17\x92\x97\x18\xd7\x80\x27\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
 \x00\x00\xdf\x01\
 \x89\
 \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@@ -48574,6 +48682,10 @@
 \x00\x6f\
 \x00\x70\x00\x65\x00\x6e\x00\x6c\x00\x70\x00\x2d\x00\x61\x00\x62\x00\x6f\x00\x75\x00\x74\x00\x2d\x00\x6c\x00\x6f\x00\x67\x00\x6f\
 \x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x09\xb2\xd9\xa7\
+\x00\x65\
+\x00\x78\x00\x63\x00\x65\x00\x70\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
 \x00\x18\
 \x0e\xf7\x81\x87\
 \x00\x6f\
@@ -48794,16 +48906,16 @@
 
 qt_resource_struct = "\
 \x00\x00\x00\x00\x00\x02\x00\x00\x00\x0f\x00\x00\x00\x01\
-\x00\x00\x00\x98\x00\x02\x00\x00\x00\x06\x00\x00\x00\x65\
-\x00\x00\x00\x3a\x00\x02\x00\x00\x00\x04\x00\x00\x00\x61\
-\x00\x00\x00\xf4\x00\x02\x00\x00\x00\x03\x00\x00\x00\x5e\
-\x00\x00\x00\x5e\x00\x02\x00\x00\x00\x10\x00\x00\x00\x4e\
-\x00\x00\x00\x4e\x00\x02\x00\x00\x00\x02\x00\x00\x00\x4c\
-\x00\x00\x00\x84\x00\x02\x00\x00\x00\x09\x00\x00\x00\x43\
-\x00\x00\x00\x14\x00\x02\x00\x00\x00\x0b\x00\x00\x00\x38\
-\x00\x00\x00\xa6\x00\x02\x00\x00\x00\x03\x00\x00\x00\x35\
-\x00\x00\x00\xe2\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x2b\
-\x00\x00\x00\x6e\x00\x02\x00\x00\x00\x02\x00\x00\x00\x29\
+\x00\x00\x00\x98\x00\x02\x00\x00\x00\x06\x00\x00\x00\x66\
+\x00\x00\x00\x3a\x00\x02\x00\x00\x00\x04\x00\x00\x00\x62\
+\x00\x00\x00\xf4\x00\x02\x00\x00\x00\x03\x00\x00\x00\x5f\
+\x00\x00\x00\x5e\x00\x02\x00\x00\x00\x10\x00\x00\x00\x4f\
+\x00\x00\x00\x4e\x00\x02\x00\x00\x00\x02\x00\x00\x00\x4d\
+\x00\x00\x00\x84\x00\x02\x00\x00\x00\x09\x00\x00\x00\x44\
+\x00\x00\x00\x14\x00\x02\x00\x00\x00\x0b\x00\x00\x00\x39\
+\x00\x00\x00\xa6\x00\x02\x00\x00\x00\x03\x00\x00\x00\x36\
+\x00\x00\x00\xe2\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x2c\
+\x00\x00\x00\x6e\x00\x02\x00\x00\x00\x03\x00\x00\x00\x29\
 \x00\x00\x01\x04\x00\x02\x00\x00\x00\x03\x00\x00\x00\x26\
 \x00\x00\x00\xcc\x00\x02\x00\x00\x00\x06\x00\x00\x00\x20\
 \x00\x00\x00\x26\x00\x02\x00\x00\x00\x04\x00\x00\x00\x1c\
@@ -48811,20 +48923,20 @@
 \x00\x00\x00\xb8\x00\x02\x00\x00\x00\x02\x00\x00\x00\x10\
 \x00\x00\x05\x20\x00\x00\x00\x00\x00\x01\x00\x05\xce\x8a\
 \x00\x00\x04\xee\x00\x00\x00\x00\x00\x01\x00\x03\x2d\xa8\
-\x00\x00\x0f\x18\x00\x00\x00\x00\x00\x01\x00\x0b\xab\x0a\
-\x00\x00\x0e\xc8\x00\x00\x00\x00\x00\x01\x00\x0b\xa5\xae\
-\x00\x00\x0f\xb2\x00\x00\x00\x00\x00\x01\x00\x0b\xb4\xcd\
-\x00\x00\x0e\x9e\x00\x00\x00\x00\x00\x01\x00\x0b\xa3\x10\
-\x00\x00\x0f\xde\x00\x00\x00\x00\x00\x01\x00\x0b\xb8\x00\
-\x00\x00\x0f\x88\x00\x00\x00\x00\x00\x01\x00\x0b\xb2\x55\
-\x00\x00\x0e\xee\x00\x00\x00\x00\x00\x01\x00\x0b\xa8\x88\
-\x00\x00\x10\x04\x00\x00\x00\x00\x00\x01\x00\x0b\xba\xd4\
-\x00\x00\x0f\x64\x00\x00\x00\x00\x00\x01\x00\x0b\xaf\x58\
-\x00\x00\x0f\x3e\x00\x00\x00\x00\x00\x01\x00\x0b\xad\x41\
-\x00\x00\x0c\x2a\x00\x00\x00\x00\x00\x01\x00\x0b\x7c\xd6\
-\x00\x00\x0c\x5e\x00\x00\x00\x00\x00\x01\x00\x0b\x80\x38\
-\x00\x00\x0c\x86\x00\x00\x00\x00\x00\x01\x00\x0b\x82\xd6\
-\x00\x00\x0c\xb4\x00\x00\x00\x00\x00\x01\x00\x0b\x85\xea\
+\x00\x00\x0f\x38\x00\x00\x00\x00\x00\x01\x00\x0b\xb1\xbb\
+\x00\x00\x0e\xe8\x00\x00\x00\x00\x00\x01\x00\x0b\xac\x5f\
+\x00\x00\x0f\xd2\x00\x00\x00\x00\x00\x01\x00\x0b\xbb\x7e\
+\x00\x00\x0e\xbe\x00\x00\x00\x00\x00\x01\x00\x0b\xa9\xc1\
+\x00\x00\x0f\xfe\x00\x00\x00\x00\x00\x01\x00\x0b\xbe\xb1\
+\x00\x00\x0f\xa8\x00\x00\x00\x00\x00\x01\x00\x0b\xb9\x06\
+\x00\x00\x0f\x0e\x00\x00\x00\x00\x00\x01\x00\x0b\xaf\x39\
+\x00\x00\x10\x24\x00\x00\x00\x00\x00\x01\x00\x0b\xc1\x85\
+\x00\x00\x0f\x84\x00\x00\x00\x00\x00\x01\x00\x0b\xb6\x09\
+\x00\x00\x0f\x5e\x00\x00\x00\x00\x00\x01\x00\x0b\xb3\xf2\
+\x00\x00\x0c\x4a\x00\x00\x00\x00\x00\x01\x00\x0b\x83\x87\
+\x00\x00\x0c\x7e\x00\x00\x00\x00\x00\x01\x00\x0b\x86\xe9\
+\x00\x00\x0c\xa6\x00\x00\x00\x00\x00\x01\x00\x0b\x89\x87\
+\x00\x00\x0c\xd4\x00\x00\x00\x00\x00\x01\x00\x0b\x8c\x9b\
 \x00\x00\x04\x48\x00\x00\x00\x00\x00\x01\x00\x03\x22\x29\
 \x00\x00\x04\x92\x00\x00\x00\x00\x00\x01\x00\x03\x27\x6d\
 \x00\x00\x03\xfe\x00\x00\x00\x00\x00\x01\x00\x03\x1d\x0f\
@@ -48836,6 +48948,7 @@
 \x00\x00\x01\x50\x00\x00\x00\x00\x00\x01\x00\x00\x02\xfe\
 \x00\x00\x08\x58\x00\x00\x00\x00\x00\x01\x00\x09\xdd\xa3\
 \x00\x00\x08\x88\x00\x00\x00\x00\x00\x01\x00\x0a\x4c\xe8\
+\x00\x00\x08\xa8\x00\x00\x00\x00\x00\x01\x00\x0a\x53\x99\
 \x00\x00\x02\x26\x00\x00\x00\x00\x00\x01\x00\x02\xfd\x0c\
 \x00\x00\x03\xb4\x00\x00\x00\x00\x00\x01\x00\x03\x16\x7a\
 \x00\x00\x02\x4c\x00\x00\x00\x00\x00\x01\x00\x03\x00\x3d\
@@ -48849,17 +48962,17 @@
 \x00\x00\x05\x76\x00\x00\x00\x00\x00\x01\x00\x08\x72\x0a\
 \x00\x00\x05\x96\x00\x00\x00\x00\x00\x01\x00\x08\x75\xe7\
 \x00\x00\x05\x50\x00\x00\x00\x00\x00\x01\x00\x08\x6f\x6c\
-\x00\x00\x0e\x1a\x00\x00\x00\x00\x00\x01\x00\x0b\x9c\x53\
-\x00\x00\x0e\x74\x00\x00\x00\x00\x00\x01\x00\x0b\xa1\x0c\
-\x00\x00\x0d\x00\x00\x00\x00\x00\x00\x01\x00\x0b\x8a\xbd\
-\x00\x00\x0d\x8c\x00\x00\x00\x00\x00\x01\x00\x0b\x91\x4b\
-\x00\x00\x0d\xf6\x00\x00\x00\x00\x00\x01\x00\x0b\x99\x20\
-\x00\x00\x0d\x56\x00\x00\x00\x00\x00\x01\x00\x0b\x8f\x52\
-\x00\x00\x0d\xb0\x00\x00\x00\x00\x00\x01\x00\x0b\x93\xdc\
-\x00\x00\x0d\xd2\x00\x00\x00\x00\x00\x01\x00\x0b\x95\xef\
-\x00\x00\x0e\x50\x00\x00\x00\x00\x00\x01\x00\x0b\x9e\x3b\
-\x00\x00\x0c\xd8\x00\x00\x00\x00\x00\x01\x00\x0b\x88\x01\
-\x00\x00\x0d\x34\x00\x00\x00\x00\x00\x01\x00\x0b\x8c\xb4\
+\x00\x00\x0e\x3a\x00\x00\x00\x00\x00\x01\x00\x0b\xa3\x04\
+\x00\x00\x0e\x94\x00\x00\x00\x00\x00\x01\x00\x0b\xa7\xbd\
+\x00\x00\x0d\x20\x00\x00\x00\x00\x00\x01\x00\x0b\x91\x6e\
+\x00\x00\x0d\xac\x00\x00\x00\x00\x00\x01\x00\x0b\x97\xfc\
+\x00\x00\x0e\x16\x00\x00\x00\x00\x00\x01\x00\x0b\x9f\xd1\
+\x00\x00\x0d\x76\x00\x00\x00\x00\x00\x01\x00\x0b\x96\x03\
+\x00\x00\x0d\xd0\x00\x00\x00\x00\x00\x01\x00\x0b\x9a\x8d\
+\x00\x00\x0d\xf2\x00\x00\x00\x00\x00\x01\x00\x0b\x9c\xa0\
+\x00\x00\x0e\x70\x00\x00\x00\x00\x00\x01\x00\x0b\xa4\xec\
+\x00\x00\x0c\xf8\x00\x00\x00\x00\x00\x01\x00\x0b\x8e\xb2\
+\x00\x00\x0d\x54\x00\x00\x00\x00\x00\x01\x00\x0b\x93\x65\
 \x00\x00\x07\xe0\x00\x00\x00\x00\x00\x01\x00\x09\xd7\x31\
 \x00\x00\x07\x64\x00\x00\x00\x00\x00\x01\x00\x09\xcd\xd6\
 \x00\x00\x07\x08\x00\x00\x00\x00\x00\x01\x00\x09\xc8\x14\
@@ -48869,31 +48982,31 @@
 \x00\x00\x07\xba\x00\x00\x00\x00\x00\x01\x00\x09\xd4\xce\
 \x00\x00\x08\x30\x00\x00\x00\x00\x00\x01\x00\x09\xdb\x9d\
 \x00\x00\x08\x08\x00\x00\x00\x00\x00\x01\x00\x09\xd9\x83\
-\x00\x00\x0b\x38\x00\x00\x00\x00\x00\x01\x00\x0b\x6c\x2a\
-\x00\x00\x0b\x5c\x00\x00\x00\x00\x00\x01\x00\x0b\x6f\x28\
-\x00\x00\x0b\x14\x00\x00\x00\x00\x00\x01\x00\x0b\x69\x3e\
-\x00\x00\x09\x00\x00\x00\x00\x00\x00\x01\x00\x0b\x32\x08\
-\x00\x00\x09\x56\x00\x00\x00\x00\x00\x01\x00\x0b\x37\x6e\
-\x00\x00\x0a\x0e\x00\x00\x00\x00\x00\x01\x00\x0b\x49\x3f\
-\x00\x00\x09\x76\x00\x00\x00\x00\x00\x01\x00\x0b\x3b\x61\
-\x00\x00\x0a\x70\x00\x00\x00\x00\x00\x01\x00\x0b\x59\xfd\
-\x00\x00\x09\xca\x00\x00\x00\x00\x00\x01\x00\x0b\x41\xf3\
-\x00\x00\x09\x9c\x00\x00\x00\x00\x00\x01\x00\x0b\x3f\x73\
-\x00\x00\x0a\xf4\x00\x00\x00\x00\x00\x01\x00\x0b\x66\x32\
-\x00\x00\x08\xe2\x00\x00\x00\x00\x00\x01\x00\x0b\x2f\x66\
-\x00\x00\x09\x28\x00\x00\x00\x00\x00\x01\x00\x0b\x35\x66\
-\x00\x00\x0a\x9a\x00\x00\x00\x00\x00\x01\x00\x0b\x5c\x32\
-\x00\x00\x0a\xc8\x00\x00\x00\x00\x00\x01\x00\x0b\x62\xf0\
-\x00\x00\x08\xbe\x00\x00\x00\x00\x00\x01\x00\x0b\x2b\xed\
-\x00\x00\x09\xec\x00\x00\x00\x00\x00\x01\x00\x0b\x45\xf7\
-\x00\x00\x0a\x40\x00\x00\x00\x00\x00\x01\x00\x0b\x50\x55\
+\x00\x00\x0b\x58\x00\x00\x00\x00\x00\x01\x00\x0b\x72\xdb\
+\x00\x00\x0b\x7c\x00\x00\x00\x00\x00\x01\x00\x0b\x75\xd9\
+\x00\x00\x0b\x34\x00\x00\x00\x00\x00\x01\x00\x0b\x6f\xef\
+\x00\x00\x09\x20\x00\x00\x00\x00\x00\x01\x00\x0b\x38\xb9\
+\x00\x00\x09\x76\x00\x00\x00\x00\x00\x01\x00\x0b\x3e\x1f\
+\x00\x00\x0a\x2e\x00\x00\x00\x00\x00\x01\x00\x0b\x4f\xf0\
+\x00\x00\x09\x96\x00\x00\x00\x00\x00\x01\x00\x0b\x42\x12\
+\x00\x00\x0a\x90\x00\x00\x00\x00\x00\x01\x00\x0b\x60\xae\
+\x00\x00\x09\xea\x00\x00\x00\x00\x00\x01\x00\x0b\x48\xa4\
+\x00\x00\x09\xbc\x00\x00\x00\x00\x00\x01\x00\x0b\x46\x24\
+\x00\x00\x0b\x14\x00\x00\x00\x00\x00\x01\x00\x0b\x6c\xe3\
+\x00\x00\x09\x02\x00\x00\x00\x00\x00\x01\x00\x0b\x36\x17\
+\x00\x00\x09\x48\x00\x00\x00\x00\x00\x01\x00\x0b\x3c\x17\
+\x00\x00\x0a\xba\x00\x00\x00\x00\x00\x01\x00\x0b\x62\xe3\
+\x00\x00\x0a\xe8\x00\x00\x00\x00\x00\x01\x00\x0b\x69\xa1\
+\x00\x00\x08\xde\x00\x00\x00\x00\x00\x01\x00\x0b\x32\x9e\
+\x00\x00\x0a\x0c\x00\x00\x00\x00\x00\x01\x00\x0b\x4c\xa8\
+\x00\x00\x0a\x60\x00\x00\x00\x00\x00\x01\x00\x0b\x57\x06\
 \x00\x00\x01\xd2\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xd8\
 \x00\x00\x01\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x09\x05\
 \x00\x00\x02\x04\x00\x00\x00\x00\x00\x01\x00\x02\xfa\x36\
-\x00\x00\x0b\x7c\x00\x00\x00\x00\x00\x01\x00\x0b\x71\xab\
-\x00\x00\x0b\xde\x00\x00\x00\x00\x00\x01\x00\x0b\x78\x21\
-\x00\x00\x0b\xb0\x00\x00\x00\x00\x00\x01\x00\x0b\x75\x0d\
-\x00\x00\x0c\x06\x00\x00\x00\x00\x00\x01\x00\x0b\x7a\xbf\
+\x00\x00\x0b\x9c\x00\x00\x00\x00\x00\x01\x00\x0b\x78\x5c\
+\x00\x00\x0b\xfe\x00\x00\x00\x00\x00\x01\x00\x0b\x7e\xd2\
+\x00\x00\x0b\xd0\x00\x00\x00\x00\x00\x01\x00\x0b\x7b\xbe\
+\x00\x00\x0c\x26\x00\x00\x00\x00\x00\x01\x00\x0b\x81\x70\
 \x00\x00\x06\x48\x00\x00\x00\x00\x00\x01\x00\x08\xb2\xf5\
 \x00\x00\x05\xe8\x00\x00\x00\x00\x00\x01\x00\x08\x83\xb5\
 \x00\x00\x05\xb8\x00\x00\x00\x00\x00\x01\x00\x08\x79\x21\
@@ -48914,4 +49027,5 @@
     Cleanup OpenLP resources when the application shuts down.
     """
     QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name,
-        qt_resource_data)
\ No newline at end of file
+        qt_resource_data)
+

=== added file 'openlp/core/ui/exceptiondialog.py'
--- openlp/core/ui/exceptiondialog.py	1970-01-01 00:00:00 +0000
+++ openlp/core/ui/exceptiondialog.py	2010-09-08 04:58:38 +0000
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2010 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael      #
+# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian      #
+# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble,    #
+# Carsten Tinggaard, Frode Woldsund                                           #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+from PyQt4 import QtCore, QtGui
+
+from openlp.core.lib import translate
+
+class Ui_ExceptionDialog(object):
+    def setupUi(self, exceptionDialog):
+        exceptionDialog.setObjectName(u'exceptionDialog')
+        exceptionDialog.resize(580, 407)
+        self.exceptionLayout = QtGui.QVBoxLayout(exceptionDialog)
+        self.exceptionLayout.setSpacing(8)
+        self.exceptionLayout.setMargin(8)
+        self.exceptionLayout.setObjectName(u'exceptionLayout')
+        self.messageLayout = QtGui.QHBoxLayout()
+        self.messageLayout.setSpacing(0)
+        self.messageLayout.setContentsMargins(0, -1, 0, -1)
+        self.messageLayout.setObjectName(u'messageLayout')
+        self.bugLabel = QtGui.QLabel(exceptionDialog)
+        self.bugLabel.setMinimumSize(QtCore.QSize(64, 64))
+        self.bugLabel.setMaximumSize(QtCore.QSize(64, 64))
+        self.bugLabel.setText(u'')
+        self.bugLabel.setPixmap(QtGui.QPixmap(u':/graphics/exception.png'))
+        self.bugLabel.setAlignment(QtCore.Qt.AlignCenter)
+        self.bugLabel.setObjectName(u'bugLabel')
+        self.messageLayout.addWidget(self.bugLabel)
+        self.messageLabel = QtGui.QLabel(exceptionDialog)
+        self.messageLabel.setWordWrap(True)
+        self.messageLabel.setObjectName(u'messageLabel')
+        self.messageLayout.addWidget(self.messageLabel)
+        self.exceptionLayout.addLayout(self.messageLayout)
+        self.exceptionTextEdit = QtGui.QPlainTextEdit(exceptionDialog)
+        self.exceptionTextEdit.setReadOnly(True)
+        self.exceptionTextEdit.setBackgroundVisible(False)
+        self.exceptionTextEdit.setObjectName(u'exceptionTextEdit')
+        self.exceptionLayout.addWidget(self.exceptionTextEdit)
+        self.exceptionButtonBox = QtGui.QDialogButtonBox(exceptionDialog)
+        self.exceptionButtonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.exceptionButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Close)
+        self.exceptionButtonBox.setObjectName(u'exceptionButtonBox')
+        self.exceptionLayout.addWidget(self.exceptionButtonBox)
+
+        self.retranslateUi(exceptionDialog)
+        QtCore.QObject.connect(self.exceptionButtonBox,
+            QtCore.SIGNAL(u'accepted()'), exceptionDialog.accept)
+        QtCore.QObject.connect(self.exceptionButtonBox,
+            QtCore.SIGNAL(u'rejected()'), exceptionDialog.reject)
+        QtCore.QMetaObject.connectSlotsByName(exceptionDialog)
+
+    def retranslateUi(self, exceptionDialog):
+        exceptionDialog.setWindowTitle(
+            translate('OpenLP.ExceptionDialog', 'Error Occured'))
+        self.messageLabel.setText(translate('OpenLP.ExceptionDialog', 'Oops! '
+            'OpenLP hit a problem, and couldn\'t recover. The text in the box '
+            'below contains information that might be helpful to the OpenLP '
+            'developers, so please e-mail it to bugs@xxxxxxxxxx, along with a '
+            'detailed description of what you were doing when the problem '
+            'occurred.'))

=== added file 'openlp/core/ui/exceptionform.py'
--- openlp/core/ui/exceptionform.py	1970-01-01 00:00:00 +0000
+++ openlp/core/ui/exceptionform.py	2010-09-08 04:58:38 +0000
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2010 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael      #
+# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian      #
+# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble,    #
+# Carsten Tinggaard, Frode Woldsund                                           #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+from PyQt4 import QtCore, QtGui
+
+from exceptiondialog import Ui_ExceptionDialog
+from openlp.core.lib import translate
+
+class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog):
+    """
+    The exception dialog
+    """
+    def __init__(self, parent):
+        QtGui.QDialog.__init__(self, parent)
+        self.setupUi(self)

=== added file 'resources/forms/exceptiondialog.ui'
--- resources/forms/exceptiondialog.ui	1970-01-01 00:00:00 +0000
+++ resources/forms/exceptiondialog.ui	2010-09-08 04:58:38 +0000
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ExceptionDialog</class>
+ <widget class="QDialog" name="ExceptionDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>580</width>
+    <height>407</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <layout class="QVBoxLayout" name="exceptionLayout">
+   <property name="spacing">
+    <number>8</number>
+   </property>
+   <property name="margin">
+    <number>8</number>
+   </property>
+   <item>
+    <layout class="QHBoxLayout" name="messageLayout">
+     <property name="spacing">
+      <number>0</number>
+     </property>
+     <property name="leftMargin">
+      <number>0</number>
+     </property>
+     <property name="rightMargin">
+      <number>0</number>
+     </property>
+     <item>
+      <widget class="QLabel" name="bugLabel">
+       <property name="minimumSize">
+        <size>
+         <width>64</width>
+         <height>64</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>64</width>
+         <height>64</height>
+        </size>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="pixmap">
+        <pixmap resource="../images/openlp-2.qrc">:/graphics/exception.png</pixmap>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="messageLabel">
+       <property name="text">
+        <string>Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@xxxxxxxxxx, along with a detailed description of what you were doing when the problem occurred.</string>
+       </property>
+       <property name="wordWrap">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QPlainTextEdit" name="exceptionTextEdit">
+     <property name="readOnly">
+      <bool>true</bool>
+     </property>
+     <property name="backgroundVisible">
+      <bool>false</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="exceptionButtonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Close</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../images/openlp-2.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>exceptionButtonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>ExceptionDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>exceptionButtonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>ExceptionDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>

=== added file 'resources/images/exception.png'
Binary files resources/images/exception.png	1970-01-01 00:00:00 +0000 and resources/images/exception.png	2010-09-08 04:58:38 +0000 differ
=== modified file 'resources/images/openlp-2.qrc'
--- resources/images/openlp-2.qrc	2010-07-03 21:07:21 +0000
+++ resources/images/openlp-2.qrc	2010-09-08 04:58:38 +0000
@@ -62,6 +62,7 @@
     <file>openlp-logo-256x256.png</file>
   </qresource>
   <qresource prefix="graphics">
+    <file>exception.png</file>
     <file>openlp-about-logo.png</file>
     <file>openlp-splash-screen.png</file>
   </qresource>


Follow ups