50 lines
1.1 KiB
Python
50 lines
1.1 KiB
Python
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
|
|
|
|
|