OSDN Git Service

implemented SaveLoadError for nice and consistent error handling of expected cases
authorJon Nordby <jononor@gmail.com>
Tue, 16 Jun 2009 13:52:11 +0000 (15:52 +0200)
committerJon Nordby <jononor@gmail.com>
Tue, 16 Jun 2009 15:58:41 +0000 (17:58 +0200)
gui/drawwindow.py
lib/document.py

index c4cd414..d361f2d 100644 (file)
@@ -714,12 +714,11 @@ class Window(gtk.Window):
     def open_file(self, filename):
         try:
             self.doc.load(filename)
-        except Exception, e:
+        except document.SaveLoadError, e:
             d = gtk.MessageDialog(self, type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK)
             d.set_markup(str(e))
             d.run()
             d.destroy()
-            raise
         else:
             self.filename = os.path.abspath(filename)
             print 'Loaded from', self.filename
@@ -730,13 +729,12 @@ class Window(gtk.Window):
     def save_file(self, filename, **options):
         try:
             x, y, w, h =  self.doc.get_bbox()
-            assert w > 0 and h > 0, 'The canvas is empty.'
+            if w == 0 and h == 0:
+                raise document.SaveLoadError, 'Did not save, the canvas is empty.'
             self.doc.save(filename, **options)
-        except Exception, e:
-            print 'Failed to save, traceback:'
-            traceback.print_exc()
+        except document.SaveLoadError, e:
             d = gtk.MessageDialog(self, type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK)
-            d.set_markup('Failed to save:\n' + str(e))
+            d.set_markup(str(e))
             d.run()
             d.destroy()
         else:
index da50878..faf5e02 100644 (file)
@@ -35,6 +35,10 @@ from gtk import gdk
 
 N = tiledsurface.N
 
+class SaveLoadError(Exception):
+    """Expected errors on loading or saving, like missing permissions or non-existing files."""
+    pass
+
 class Document():
     """
     This is the "model" in the Model-View-Controller design.
@@ -230,6 +234,13 @@ class Document():
         return count > 1
 
     def save(self, filename, **kwargs):
+        #if the file doesnt allready exist, we need to check permissions on the directory
+        if not os.path.isfile(filename): 
+            path = os.path.dirname(filename)
+        else:
+            path = filename
+        if not os.access(path,os.W_OK):
+            raise SaveLoadError, 'You do not have the necessary permissions to save file: ' + repr(filename)
         trash, ext = os.path.splitext(filename)
         ext = ext.lower().replace('.', '')
         save = getattr(self, 'save_' + ext, self.unsupported)
@@ -237,8 +248,11 @@ class Document():
         self.unsaved_painting_time = 0.0
 
     def load(self, filename):
+        if not os.path.isfile(filename):
+            raise SaveLoadError, 'File does not exist: ' + repr(filename)
+        if not os.access(filename,os.R_OK):
+            raise SaveLoadError, 'You do not have the necessary permissions to open file: ' + repr(filename)
         trash, ext = os.path.splitext(filename)
-        # consider catching and raising "nicer" (consistent) Errors for files that doesnt exist when trying to open them
         ext = ext.lower().replace('.', '')
         load = getattr(self, 'load_' + ext, self.unsupported)
         load(filename)
@@ -246,7 +260,7 @@ class Document():
         self.unsaved_painting_time = 0.0
 
     def unsupported(self, filename):
-        raise ValueError, 'Unknown file format extension: ' + repr(filename)
+        raise SaveLoadError, 'Unknown file format extension: ' + repr(filename)
 
     def render_as_pixbuf(self, *args):
         return pixbufsurface.render_as_pixbuf(self, *args)