from typing import Optional class PyTeXError(Exception): def __init__(self, msg, explanation: Optional[str] = None): self._msg = msg self._traceback_explanation = [] if explanation is not None: self._traceback_explanation.append(explanation) super().__init__(self._dispstr()) def _dispstr(self): depth = 0 ret = [self._msg] for explanation in self._traceback_explanation: ret.append(' ' * 2 * depth + explanation) depth += 1 return '\n'.join(ret) def add_explanation(self, explanation: str): self._traceback_explanation.append(explanation) def __str__(self): return self._dispstr() class PyTeXFormattingError(PyTeXError): pass class PyTeXBuildError(PyTeXError): pass class PyTeXMacroError(PyTeXError): pass class PyTeXInvalidMacroUsageError(PyTeXMacroError): pass class PyTeXInvalidBeginMacroCodeUsageError(PyTeXInvalidMacroUsageError): pass class PyTeXInvalidEndMacroCodeUsageError(PyTeXInvalidMacroUsageError): pass