Index: /trunk/ippToPsps/jython/batch.py
===================================================================
--- /trunk/ippToPsps/jython/batch.py	(revision 33786)
+++ /trunk/ippToPsps/jython/batch.py	(revision 33787)
@@ -39,5 +39,4 @@
                  useFullTables): 
 
-        self.everythingOK = False
         self.readHeader = False
         self.config = config
@@ -66,5 +65,5 @@
             if not self.header: 
                 logger.errorPair("Could not read FITS for id", "%d" % id)
-                return
+                raise
 
         self.scratchDb.setUseFullTables(self.useFullTables)
@@ -115,5 +114,4 @@
         self.logger.infoPair("Output path", self.localOutPath)
 
-        self.everythingOK = True
     
     '''
@@ -510,28 +508,23 @@
     def run(self):
 
-        if not self.everythingOK:
-            self.logger.errorPair("Aborting this batch", "could not initialize")
-            self.ippToPspsDb.updateProcessed(self.batchID, -1)
-            return
-
         if not self.createEmptyPspsTables():
             self.logger.errorPair("Aborting this batch", "could not create empty PSPS tables")
             self.ippToPspsDb.updateProcessed(self.batchID, -1)
-            return
+            raise
 
         if not self.importIppTables():
             self.logger.errorPair("Aborting this batch", "could not import IPP tables")
             self.ippToPspsDb.updateProcessed(self.batchID, -1)
-            return
+            raise
 
         if not self.populatePspsTables():
             self.logger.errorPair("Aborting this batch", "unable to populate PSPS tables")
             self.ippToPspsDb.updateProcessed(self.batchID, -1)
-            return 
+            raise 
 
         if not self.exportPspsTablesToFits():
             self.logger.errorPair("Aborting this batch", "unable to export tables to FITS file")
             self.ippToPspsDb.updateProcessed(self.batchID, -1)
-            return 
+            raise 
    
         if self.writeBatchManifest():
Index: /trunk/ippToPsps/jython/cleanup.py
===================================================================
--- /trunk/ippToPsps/jython/cleanup.py	(revision 33786)
+++ /trunk/ippToPsps/jython/cleanup.py	(revision 33787)
@@ -129,5 +129,7 @@
 Start of program
 '''
-cleanup = Cleanup(sys.argv)
-cleanup.run()
-cleanup.exitProgram("finished")
+try:
+    cleanup = Cleanup(sys.argv)
+    cleanup.run()
+    cleanup.exitProgram("completed")
+except: pass
Index: /trunk/ippToPsps/jython/datastoreRemover.py
===================================================================
--- /trunk/ippToPsps/jython/datastoreRemover.py	(revision 33786)
+++ /trunk/ippToPsps/jython/datastoreRemover.py	(revision 33787)
@@ -46,6 +46,8 @@
 Start of program
 '''
-datastoreRemover = DatastoreRemover(sys.argv)
-datastoreRemover.run()
-datastoreRemover.exitProgram("finished")
+try:
+    datastoreRemover = DatastoreRemover(sys.argv)
+    datastoreRemover.run()
+    datastoreRemover.exitProgram("completed")
+except: pass
 
Index: /trunk/ippToPsps/jython/detectionbatch.py
===================================================================
--- /trunk/ippToPsps/jython/detectionbatch.py	(revision 33786)
+++ /trunk/ippToPsps/jython/detectionbatch.py	(revision 33787)
@@ -53,11 +53,9 @@
                useFullTables)
 
-       if not self.everythingOK: return
-
        # get camera meta data
        meta = self.gpc1Db.getCameraStageMeta(self.id)
        if not meta:
-           self.everythingOK = False
-           return
+           self.logger.errorPair("Could not get", "camera metadata")
+           raise
 
        self.expID = meta[0];
@@ -93,14 +91,14 @@
        # get a fre primary header values. if in test mode, then use defaults
        if self.safeDictionaryAccessWithDefault(self.header, 'MJD-OBS', "1") == "NULL":
-           self.everythingOK = False
-           return
+           self.logger.errorPair("Could not get", "MJD-OBS")
+           raise
 
        if self.safeDictionaryAccessWithDefault(self.header, 'EXPTIME', "1") == "NULL":
-           self.everythingOK = False
-           return
+           self.logger.errorPair("Could not get", "EXPTIME")
+           raise
 
        if self.safeDictionaryAccessWithDefault(self.header, 'FILTERID', "g.0000") == "NULL":
-           self.everythingOK = False
-           return
+           self.logger.errorPair("Could not get", "FILTERID")
+           raise
        
        self.obsTime = float(self.header['MJD-OBS']) + (float(self.header['EXPTIME']) / 172800.0)
Index: /trunk/ippToPsps/jython/dvo.py
===================================================================
--- /trunk/ippToPsps/jython/dvo.py	(revision 33786)
+++ /trunk/ippToPsps/jython/dvo.py	(revision 33787)
@@ -47,5 +47,8 @@
        
         # connect to the specified scratch database
-        self.scratchDb = ScratchDb(self.logger, self.config, scratchDbName)
+        try:
+            self.scratchDb = ScratchDb(self.logger, self.config, scratchDbName)
+        except: raise
+
         self.scratchDb.setUseFullTables(True)
 
Index: /trunk/ippToPsps/jython/ipptopsps.py
===================================================================
--- /trunk/ippToPsps/jython/ipptopsps.py	(revision 33786)
+++ /trunk/ippToPsps/jython/ipptopsps.py	(revision 33787)
@@ -50,5 +50,9 @@
 
         # create connection to databases database
-        self.ippToPspsDb = IppToPspsDb(self.logger, self.config)
+        try:
+            self.ippToPspsDb = IppToPspsDb(self.logger, self.config)
+        except:
+            self.exitProgram("Could not connect to ipptopsps Db")
+            raise
 
         self.checkClientStatus()
Index: /trunk/ippToPsps/jython/loader.py
===================================================================
--- /trunk/ippToPsps/jython/loader.py	(revision 33786)
+++ /trunk/ippToPsps/jython/loader.py	(revision 33787)
@@ -45,10 +45,9 @@
                 self.scratchDb.disconnect()
                 continue
-            self.logger.infoPair("Using scratch Db", self.scratchDb.dbName)
             break
 
-        if not self.scratchDb.connected: 
-            self.logger.errorPair("Cannot connect to a", "scratch database")
-            return
+        if not self.scratchDb.connected:
+            self.exitProgram("Cannot connect to a scratch database")
+            raise
        
         # create Datastore objects
@@ -198,38 +197,44 @@
     
             self.ippToPspsDb.unlockTables()
+            self.ippToPspsDb.deletePendingItem(batchType, id)
+
+            # catch any raised exceptions in batch constructors
+            try:
+                if batchType == "P2":
+                    batch = DetectionBatch(self.logger,
+                            self.config,
+                            self.gpc1Db,
+                            self.ippToPspsDb,
+                            self.scratchDb,
+                            id,
+                            batchID,
+                            useFullTables)
+                elif batchType == "ST":
+                    batch = StackBatch(self.logger,
+                            self.config,
+                            self.gpc1Db,
+                            self.ippToPspsDb,
+                            self.scratchDb,
+                            id,
+                            batchID,
+                            useFullTables)
+    
+                elif batchType == "OB":
+                    batch = ObjectBatch(self.logger,
+                            self.config,
+                            self.gpc1Db,
+                            self.ippToPspsDb,
+                            self.scratchDb,
+                            id,
+                            batchID,
+                            useFullTables)
+    
+                batch.run()
    
-            self.ippToPspsDb.deletePendingItem(batchType, id)
-
-            if batchType == "P2":
-                batch = DetectionBatch(self.logger,
-                        self.config,
-                        self.gpc1Db,
-                        self.ippToPspsDb,
-                        self.scratchDb,
-                        id,
-                        batchID,
-                        useFullTables)
-            elif batchType == "ST":
-                batch = StackBatch(self.logger,
-                        self.config,
-                        self.gpc1Db,
-                        self.ippToPspsDb,
-                        self.scratchDb,
-                        id,
-                        batchID,
-                        useFullTables)
-    
-            elif batchType == "OB":
-                batch = ObjectBatch(self.logger,
-                        self.config,
-                        self.gpc1Db,
-                        self.ippToPspsDb,
-                        self.scratchDb,
-                        id,
-                        batchID,
-                        useFullTables)
-    
-            batch.run()
-    
+            # if batch fails, ignore and move on to the next one
+            except: 
+                self.logger.errorPair("Problem with this %s batch (%d)" % (batchType, id), "skipping")
+                pass
+
             if not self.checkClientStatus(): return False
     
@@ -256,6 +261,7 @@
     loader = Loader(sys.argv)
     loader.run()
-    loader.exitProgram("finished")
+    loader.exitProgram("completed")
 except Exception, e:
     print str(e)
     traceback.print_exc()
+
Index: /trunk/ippToPsps/jython/metrics.py
===================================================================
--- /trunk/ippToPsps/jython/metrics.py	(revision 33786)
+++ /trunk/ippToPsps/jython/metrics.py	(revision 33787)
@@ -191,8 +191,10 @@
 Start of program.
 '''
-metrics = Metrics(sys.argv)
-metrics.run()
-metrics.exitProgram("finished")
-
-
-
+try:
+    metrics = Metrics(sys.argv)
+    metrics.run()
+    metrics.exitProgram("completed")
+except: pass
+
+
+
Index: /trunk/ippToPsps/jython/mysql.py
===================================================================
--- /trunk/ippToPsps/jython/mysql.py	(revision 33786)
+++ /trunk/ippToPsps/jython/mysql.py	(revision 33787)
@@ -34,4 +34,7 @@
         self.dbPass = config.getDbPassword(dbType)
 
+        # a user friendly connection sring
+        connectionStr = self.dbName + "@" + self.dbHost
+
         # set up JDBC connection
         self.url = "jdbc:mysql://"+self.dbHost+"/"+self.dbName+"?autoReconnect=true&user="+self.dbUser+"&password="+self.dbPass
@@ -39,12 +42,10 @@
             self.con = DriverManager.getConnection(self.url)
             self.connectionID = self.getLastConnectionID()
-            self.logger.debug("MySQL connection to %s with ID %d" % (dbType, self.connectionID))
+            self.logger.infoPair("Connected to MySQL Db", connectionStr)
         except:
-            self.logger.error("Unable to connect to " + self.url)
-            self.everythingOK = False # TODO need this?
+            self.logger.errorPair("Unable to connect to", connectionStr)
             self.connected = False
-            return
-
-        self.everythingOK = True
+            raise
+
         self.connected = True
 
@@ -251,8 +252,25 @@
         except: pass
             #self.logger.warn("Index already in place on '" + column + "' for table '" + table + "'")
+
+    '''
+    Checks that we have a connection
+    '''
+    def isConnected(self):
+
+        try: 
+            self.con
+            self.connected = True
+        except:
+            self.logger.errorPair("Not connected to", self.url)
+            self.connected = False
+
+        return self.connected
+
     '''
     TODO
     '''
     def execute(self, sql):
+
+        if not self.isConnected(): raise
 
         stmt = self.con.createStatement()
@@ -265,4 +283,6 @@
     def executeQuery(self, sql):
 
+        if not self.isConnected(): raise
+  
         stmt = self.con.createStatement()
         rs = stmt.executeQuery(sql)
Index: /trunk/ippToPsps/jython/objectbatch.py
===================================================================
--- /trunk/ippToPsps/jython/objectbatch.py	(revision 33786)
+++ /trunk/ippToPsps/jython/objectbatch.py	(revision 33787)
@@ -51,7 +51,9 @@
                1)
 
-       if not self.everythingOK: return
-
-       self.dvoObjects = DvoObjects(self.logger, self.config, self.scratchDb.dbName)
+       try:
+           self.dvoObjects = DvoObjects(self.logger, self.config, self.scratchDb.dbName)
+       except:
+           self.logger.errorPair("Unable to create instance of", "DvoObjects")
+           raise
 
        # create an output filename, which is {dvoINDEX}.FITS
Index: /trunk/ippToPsps/jython/plotter.py
===================================================================
--- /trunk/ippToPsps/jython/plotter.py	(revision 33786)
+++ /trunk/ippToPsps/jython/plotter.py	(revision 33787)
@@ -39,4 +39,6 @@
 Start of program
 '''
-plotter = Plotter(sys.argv)
-plotter.exitProgram("finished")
+try:
+    plotter = Plotter(sys.argv)
+    plotter.exitProgram("completed")
+except: pass
Index: /trunk/ippToPsps/jython/pollOdm.py
===================================================================
--- /trunk/ippToPsps/jython/pollOdm.py	(revision 33786)
+++ /trunk/ippToPsps/jython/pollOdm.py	(revision 33787)
@@ -132,5 +132,7 @@
 Program starts here
 '''
-pollodm = PollOdm(sys.argv)
-pollodm.run()
-pollodm.exitProgram("finished")
+try:
+    pollodm = PollOdm(sys.argv)
+    pollodm.run()
+    pollodm.exitProgram("completed")
+except: pass
Index: /trunk/ippToPsps/jython/queue.py
===================================================================
--- /trunk/ippToPsps/jython/queue.py	(revision 33786)
+++ /trunk/ippToPsps/jython/queue.py	(revision 33787)
@@ -27,9 +27,12 @@
         super(Queue, self).__init__(argv)
 
-
         # create various objects
         self.gpc1Db = Gpc1Db(self.logger, self.config)
         self.datastore = Datastore(self.logger, self.config, self.ippToPspsDb)
-        self.dvoObjects = DvoObjects(self.logger, self.config)
+        try:
+            self.dvoObjects = DvoObjects(self.logger, self.config)
+        except:
+            self.exitProgram("Unable to create instance of DvoObject")
+            raise
 
         self.config.printAll()
@@ -164,5 +167,8 @@
 Start of program.
 '''
-queue = Queue(sys.argv)
-queue.run()
-queue.exitProgram("finished")                             
+try:
+    queue = Queue(sys.argv)
+    queue.run()
+    queue.exitProgram("completed")
+except: pass
+
Index: /trunk/ippToPsps/jython/scratchdb.py
===================================================================
--- /trunk/ippToPsps/jython/scratchdb.py	(revision 33786)
+++ /trunk/ippToPsps/jython/scratchdb.py	(revision 33787)
@@ -278,5 +278,5 @@
             rs.close()
         except:
-            self.logger.errorPai("Can't query for ingested regions", sql)
+            self.logger.errorPair("Can't query for ingested regions", sql)
 
         return regions
Index: /trunk/ippToPsps/jython/setupScratchDb.py
===================================================================
--- /trunk/ippToPsps/jython/setupScratchDb.py	(revision 33786)
+++ /trunk/ippToPsps/jython/setupScratchDb.py	(revision 33787)
@@ -25,5 +25,9 @@
             self.exitProgram("incorrect args")
 
-        self.scratchDb = ScratchDb(self.logger, self.config, argv[2])
+        try:
+            self.scratchDb = ScratchDb(self.logger, self.config, argv[2])
+        except:
+            self.exitProgram("Could not connect to a scratch Db")
+            raise
 
 
@@ -52,7 +56,9 @@
 Program starts here
 '''
-setupScratchDb = SetupScratchDb(sys.argv)
-setupScratchDb.run()
-setupScratchDb.exitProgram("finished")
+try:
+    setupScratchDb = SetupScratchDb(sys.argv)
+    setupScratchDb.run()
+    setupScratchDb.exitProgram("completed")
+except: pass
 
 
Index: /trunk/ippToPsps/jython/stackbatch.py
===================================================================
--- /trunk/ippToPsps/jython/stackbatch.py	(revision 33786)
+++ /trunk/ippToPsps/jython/stackbatch.py	(revision 33787)
@@ -50,6 +50,4 @@
                useFullTables)
 
-       if not self.everythingOK: return
-
        self.stackType = "DEEP_STACK" # TODO
 
@@ -57,6 +55,6 @@
        meta = self.gpc1Db.getStackStageMeta(self.id)
        if not meta:
-           self.everythingOK = False
-           return
+           self.logger.errorPair("Could not get stack", "metadata")
+           raise
 
        self.filter = meta[0];
