Source code for exceptions

"""GRASS GIS 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. :: >>> 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
# TODO: we inherit from subprocess to be aligned with check_call but it is needed? # perhaps it would be better to inherit from Exception or from ScriptError
[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. """ 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, module) # 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, ) def __str__(self): return self.msg