Source code for grass.exceptions

"""GRASS interface to Python exceptions"""

import subprocess


[docs] class DBError(Exception): pass
[docs] class FatalError(Exception): pass
[docs] class FlagError(Exception): pass
[docs] class GrassError(Exception): pass
[docs] class ImplementationError(Exception): pass
[docs] class OpenError(Exception): pass
[docs] class ParameterError(Exception): pass
[docs] class ScriptError(Exception): """Raised during script execution. .. code-block:: pycon >>> error = ScriptError("My error message!") >>> error.value 'My error message!' >>> print(error) My error message! """ def __init__(self, value): self.value = value def __str__(self): return self.value
[docs] class Usage(Exception): pass
[docs] class CalledModuleError(subprocess.CalledProcessError): """Raised when a called module ends with error (non-zero return code) Used for failures of modules called as subprocesses from Python code. The class inherits from *subprocess.CalledProcessError* to allow for GRASS subprocess calls to be aligned with *subprocess.check_call* and *subprocess.run* with `check=False`. """ def __init__(self, module, code, returncode, errors=None): """Create an exception with a full error message based on the parameters. :param module: module name :param code: some code snipped which contains parameters :param returncode: process returncode (assuming non-zero) :param errors: errors provided by the module (e.g., stderr) """ # CalledProcessError has undocumented constructor super().__init__(returncode, code, None, errors) # No need to include module name if it is directly in code of if it is not set. # Otherwise, make sure module name is there if provided and not in code. executed = code if not module or module in code else f"{module} {code}" if errors: # We assume actual errors, e.g., captured stderr. err = "See the following errors:\n{errors}".format(errors=errors) else: # In command line, the errors will be above, but in testing framework # or notebooks, the errors will be somewhere else than the traceback. err = "See errors above the traceback or in the error output." # The full message self.msg = ( "Module run `{executed}` ended with an error.\n" "The subprocess ended with a non-zero return code: {returncode}." " {see_errors}" ).format( executed=executed, returncode=returncode, see_errors=err, ) self.module = module self.code = code self.errors = errors def __reduce__(self): return ( self.__class__, (self.module, self.code, self.returncode, self.errors), ) def __str__(self): return self.msg