Clean up and improve error reporting.
[matthijs/upstream/mobilegtd.git] / src / main.py
index 80a7538fe77a691afa9f9d9b8d18b8eaf3b05014..f0953a090ffeae2ae82f342f517f2c2314145c4c 100644 (file)
@@ -7,44 +7,35 @@
 #tr.go()
 
 def run():
-    import sys
-    import e32
-    if e32.in_emulator():
-        sys.path.append('c:/python/')
-        
-        
-    import os.path
-    print sys.path
-#    print os.path.dirname(__file__)
-#    sys.path.append(os.path.dirname(__file__))
-    import log.logging
-    from log.logging import logger
-    import sys,os
-    logger.log_stderr()
-    sys.stderr.write('stderr logged from default')
-    
-    
-    
-    lock=None
-    
-    from config.config import gtd_directory,read_configurations
-    read_configurations()
-
-    from inout.io import safe_chdir
-    safe_chdir(gtd_directory)
-    print os.getcwd() 
+    logger = None
     try:
+        import sys
+        import e32
+        import os
+        if e32.in_emulator():
+            sys.path.append('c:/python/')
+            
+            
+        # Set up logging
+        from log.logging import logger as _logger
+        logger = _logger
+        logger.log_stderr()
+
+       
+        # Read config
+        from config import config
+        import inout
+        config.read_configurations()
+        inout.io.safe_chdir(config.gtd_directory)
+       
+        # Yield to the scheduler
         e32.ao_yield()
-        import sys,os
     
-        import config.config, config.defaultconfig
-        import gui.gui
         from model.projects import Projects
         from gui.projects_list.project_list_view import ProjectListView
-        import inout.io
         from persistence.projects_directory import ProjectsDirectory
     
-        directory = os.path.join(config.config.gtd_directory,'@Projects')
+        directory = os.path.join(config.gtd_directory,'@Projects')
 
         projects = Projects()
         projects_directory = ProjectsDirectory(projects)
@@ -54,35 +45,63 @@ def run():
 #        projects.process()
         projects_view = ProjectListView(projects)
         projects_view.run()
-        #logger.close()
     except Exception, e:
-        import appuifw,traceback
-        trace = traceback.extract_tb(sys.exc_info()[2])
-        print e,trace
-        def display(objects):
-            strings=[]
-            for object in objects:
-                strings.append(u'%s'%object)
-            appuifw.selection_list(strings)
+        import appuifw,traceback,os
+        print e
         
-        error_text = unicode(repr(e.args))
+        (type, value, tb) = sys.exc_info()
+        lines = []
+
+        # Create error message
+        for line in traceback.format_exception_only(type, value):
+                lines.append(unicode(line))
+        lines.append("\n")
+
+        # Create stacktrace
+        trace = traceback.extract_tb(tb)
+        trace.reverse()
+
+        basedir = os.path.dirname(__file__) + os.sep
+        for (file, line, func, code) in trace:
+            # Remove the basedir from any filename, since it is not so
+            # interesting but takes up precious space.
+            if file.startswith(basedir):
+                    file = file[len(basedir):]
+            lines.append(u'\n%s:%s\nin %s:\n%s\n' % (file, line, func, code))
+
+        # Create and fill an error dialog
         t = appuifw.Text()
-        for trace_line in trace:
-            formatted_trace_line = u'\nIn %s line %s: %s "%s"'%trace_line
-            logger.log(formatted_trace_line,1)
-            t.add(formatted_trace_line)
-        logger.log(error_text,1)
-        t.add(error_text)
+        for line in lines:
+            if logger:
+                logger.log(line,1)
+            t.add(line)
+
+        # Put the focus back at the top
+        t.set_pos(0)
+
+        # Create a lock to wait on
         lock = e32.Ao_lock()
+
+        # Set up the dialog
         appuifw.app.menu=[(u'Exit', lock.signal)]
     
         appuifw.app.title=u'Error'
         appuifw.app.body=t
-        #appuifw.app.exit_key_handler=gui.exit
+        appuifw.app.exit_key_handler=lock.signal
+
+        # Wait until the exit option or button is chosen
         lock.wait()
 
-    logger.close()
+        # Exit app when script returns
+        appuifw.app.set_exit()
 
-if __name__ == "__main__":
+    if logger:
+        logger.close()
+
+try:
     run()
+except:
+    import traceback
+    traceback.print_exc()
+
 #tr.stop()