Browse Source

pythonlib/wxGUI: better error handling of vector_what

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@62826 15284696-431f-4ddb-bdfa-cd5b030d7da7
Anna Petrášová 10 years ago
parent
commit
6bd4a97b79
3 changed files with 26 additions and 9 deletions
  1. 9 4
      gui/wxpython/dbmgr/vinfo.py
  2. 7 2
      gui/wxpython/mapdisp/frame.py
  3. 10 3
      lib/python/script/vector.py

+ 9 - 4
gui/wxpython/dbmgr/vinfo.py

@@ -20,7 +20,7 @@ import types
 import wx
 
 from gui_core.gselect import VectorDBInfo as VectorDBInfoBase
-from core.gcmd        import RunCommand
+from core.gcmd        import RunCommand, GError
 from core.settings    import UserSettings
 from core.utils import _
 import grass.script as grass
@@ -92,9 +92,14 @@ class VectorDBInfo(VectorDBInfoBase):
         line = None
         nselected = 0
 
-        data = grass.vector_what(map = self.map,
-                                 coord = (float(queryCoords[0]), float(queryCoords[1])),
-                                 distance = float(qdist))
+        try:
+            data = grass.vector_what(map=self.map,
+                                     coord=(float(queryCoords[0]), float(queryCoords[1])),
+                                     distance=float(qdist))
+        except grass.ScriptError:
+            GError(parent=None,
+                   message=_("Failed to query vector map <{map}>. "
+                             "Check database settings and topology.").format(map=self.map))
 
         if len(data) < 1 or all(('Table' not in record) for record in data):
             return None

+ 7 - 2
gui/wxpython/mapdisp/frame.py

@@ -868,8 +868,13 @@ class MapFrame(SingleMapFrame):
             rastQuery = grass.raster_what(map=rast, coord=(east, north))
         if vect:
             encoding = UserSettings.Get(group='atm', key='encoding', subkey='value')
-            vectQuery = grass.vector_what(map=vect, coord=(east, north), distance=qdist,
-                                          encoding=encoding)
+            try:
+                vectQuery = grass.vector_what(map=vect, coord=(east, north), distance=qdist,
+                                              encoding=encoding)
+            except grass.ScriptError:
+                GError(parent=self,
+                       message=_("Failed to query vector map(s) <{maps}>. "
+                                 "Check database settings and topology.").format(maps=','.join(vect)))
         self._QueryMapDone()
         if 'Id' in vectQuery:
             self._queryHighlight(vectQuery)

+ 10 - 3
lib/python/script/vector.py

@@ -24,6 +24,7 @@ import __builtin__
 
 from utils import parse_key_val
 from core import *
+from grass.exceptions import CalledModuleError
 
 
 def vector_db(map, **args):
@@ -348,8 +349,11 @@ def vector_what(map, coord, distance=0.0, ttype=None, encoding=None):
     if ttype:
         cmdParams['type'] = ','.join(ttype)
 
-    ret = read_command('v.what',
-                       **cmdParams).strip()
+    try:
+        ret = read_command('v.what',
+                           **cmdParams).strip()
+    except CalledModuleError, e:
+        raise ScriptError(e.msg)
 
     if "LC_ALL" in os.environ:
         os.environ["LC_ALL"] = locale
@@ -377,7 +381,10 @@ def vector_what(map, coord, distance=0.0, ttype=None, encoding=None):
     if sys.version_info[0:2] > (2, 6):
         kwargs['object_pairs_hook'] = orderedDict
 
-    result = json.loads(ret, **kwargs)
+    try:
+        result = json.loads(ret, **kwargs)
+    except ValueError:
+        raise ScriptError(_("v.what output is not valid JSON format:\n {ret}").format(ret=ret))
 
     for vmap in result['Maps']:
         cats = vmap.pop('Categories', None)