From c90d4c5b8a515835477fba5be902241861ac1e63 Mon Sep 17 00:00:00 2001 From: bhuvan-somisetty Date: Thu, 1 Oct 2026 22:48:33 +0530 Subject: [PATCH] grass.pygrass: Raise GrassError and TypeError in RasterAbstractBase In `python/grass/pygrass/raster/abstract.py`, `RasterAbstractBase.set_region()` and `set_region_from_rast()` previously called `fatal()` and a bare `raise` when invoked on an open raster map, causing a process exit via `sys.exit()` or a `RuntimeError` due to missing active exception context. Additionally, `RasterAbstractBase.__getitem__()` called `fatal()` when passed an invalid key type instead of raising `TypeError`. Fix this by: - Raising `GrassError` when region modifications are attempted on an open raster map. - Raising `TypeError` on unsupported index key types in `__getitem__()`. - Removing the unused `fatal` import. - Adding unit tests in `test_pygrass_raster.py`. Fixes #7993. Signed-off-by: bhuvan-somisetty --- python/grass/pygrass/raster/abstract.py | 15 ++++++++------- .../raster/testsuite/test_pygrass_raster.py | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/python/grass/pygrass/raster/abstract.py b/python/grass/pygrass/raster/abstract.py index f5ad6a1d6cc..8ced0359b22 100644 --- a/python/grass/pygrass/raster/abstract.py +++ b/python/grass/pygrass/raster/abstract.py @@ -9,7 +9,8 @@ # # import GRASS modules # -from grass.script import fatal, gisenv +from grass.exceptions import GrassError +from grass.script import gisenv import grass.lib.gis as libgis import grass.lib.raster as libraster @@ -18,7 +19,7 @@ # from grass.pygrass import utils from grass.pygrass.gis.region import Region -from grass.pygrass.errors import must_be_open, must_be_in_current_mapset +from grass.pygrass.errors import must_be_in_current_mapset, must_be_open from grass.pygrass.shell.conversion import dict2html from grass.pygrass.shell.show import raw_figure @@ -408,7 +409,7 @@ def __getitem__(self, key): ) raise IndexError(msg) return self.get_row(key) - fatal("Invalid argument type.") + raise TypeError("Invalid argument type: %r." % key) def __iter__(self): """Return a constructor of the class""" @@ -503,8 +504,8 @@ def set_region_from_rast(self, rastname="", mapset=""): """ if self.is_open(): - fatal("You cannot change the region if map is open") - raise + msg = "You cannot change the region if map is open" + raise GrassError(msg) region = Region() if rastname == "": rastname = self.name @@ -522,8 +523,8 @@ def set_region(self, region): The GRASS region settings will not be modified. """ if self.is_open(): - fatal("You cannot change the region if map is open") - raise + msg = "You cannot change the region if map is open" + raise GrassError(msg) self._set_raster_window(region) def _set_raster_window(self, region): diff --git a/python/grass/pygrass/raster/testsuite/test_pygrass_raster.py b/python/grass/pygrass/raster/testsuite/test_pygrass_raster.py index 393ff42fc6f..7390152eef0 100644 --- a/python/grass/pygrass/raster/testsuite/test_pygrass_raster.py +++ b/python/grass/pygrass/raster/testsuite/test_pygrass_raster.py @@ -1,4 +1,4 @@ -from grass.exceptions import OpenError +from grass.exceptions import GrassError, OpenError from grass.gunittest.case import TestCase from grass.gunittest.main import test @@ -88,6 +88,20 @@ def test_row_range(self): r[9999] r.close() + def test_getitem_invalid_type(self): + r = RasterRow(self.name) + with self.assertRaises(TypeError): + r["invalid_key"] + + def test_set_region_open_map(self): + r = RasterRow(self.name) + r.open(mode="r") + with self.assertRaises(GrassError): + r.set_region_from_rast() + with self.assertRaises(GrassError): + r.set_region(None) + r.close() + if __name__ == "__main__": test()