Source code for petres.errors.base
from __future__ import annotations
from typing import Any
"""Custom error hierarchy for the petres package."""
class PetresError(Exception):
"""Represent package-level exceptions with optional message formatting.
Use this exception as the common base for package-specific failures. Message
templates are formatted with keyword context values.
Parameters
----------
message : str | None, default=None
Message template. If ``None``, use ``default_message``.
**context : Any
Keyword values used to format the selected template.
Raises
------
ValueError
Raised when formatting requires a missing key from ``context``.
"""
default_message: str = "An unknown Petres error occurred."
def __init__(self, message: str | None = None, **context: Any) -> None:
"""Initialize the error and format the active message template."""
self.context: dict[str, Any] = context
if message is None:
try:
message = self.default_message.format(**context)
except KeyError as e:
missing = e.args[0]
raise ValueError(
f"Missing context key '{missing}' for error message formatting "
f"in {self.__class__.__name__}"
) from None
else:
if context:
message = message.format(**context)
super().__init__(message)
def __repr__(self) -> str:
"""Return a developer-facing representation with class name and context.
Returns
-------
str
Representation containing the class name and stored context.
"""
return f"{self.__class__.__name__}({self.context})"
# ====================================
[docs]
class VisualizationError(PetresError):
"""Represent visualization-related errors.
Use this specialization when rendering or display workflows encounter
recoverable domain failures.
"""
default_message: str = "An error occurred related to visualization operations."
[docs]
class ExportError(PetresError):
"""Represent data-export-related errors.
Use this specialization for failures during serialization or file export
workflows.
"""
default_message: str = "An error occurred related to data export operations."