from yaml.scanner import ScannerError
__all__ = [
"ConfigError",
"ConfigReadError",
"ConfigTemplateError",
"ConfigTypeError",
"ConfigValueError",
"NotFoundError",
]
YAML_TAB_PROBLEM = "found character '\\t' that cannot start any token"
# Exceptions.
[docs]
class ConfigError(Exception):
"""Base class for exceptions raised when querying a configuration."""
[docs]
class NotFoundError(ConfigError):
"""A requested value could not be found in the configuration trees."""
[docs]
class ConfigValueError(ConfigError):
"""The value in the configuration is illegal."""
[docs]
class ConfigTypeError(ConfigValueError):
"""The value in the configuration did not match the expected type."""
[docs]
class ConfigTemplateError(ConfigError):
"""Base class for exceptions raised because of an invalid template."""
[docs]
class ConfigReadError(ConfigError):
"""A configuration source could not be read."""
def __init__(self, name: str, reason: Exception | None = None) -> None:
self.name = name
self.reason = reason
message = f"{name} could not be read"
if (
isinstance(reason, ScannerError)
and reason.problem == YAML_TAB_PROBLEM
and reason.problem_mark
):
# Special-case error message for tab indentation in YAML markup.
message += (
f": found tab character at line {reason.problem_mark.line + 1}, "
f"column {reason.problem_mark.column + 1}"
)
elif reason:
# Generic error message uses exception's message.
message += f": {reason}"
super().__init__(message)