Files
2025-08-01 04:33:03 -04:00

40 lines
1.1 KiB
Python

# -*- coding: utf-8 -*-
import contextlib
__all__ = ['except_and_reraise']
@contextlib.contextmanager
def except_and_reraise(*except_errs, raise_err=None, raise_msg=None):
"""Catch a lower-level error and re-raise with a more meaningful message
In some cases, Numpy linalg errors can be raised in perplexing spots. This
allows us to catch the lower-level errors in spots where we are aware of
them so that we may raise with a more meaningful message.
Parameters
----------
*except_errs : var-args, BaseException
A variable list of exceptions to catch
raise_err : BaseException, Error
The exception to raise
raise_msg : str
The message to raise
"""
if raise_err is None:
raise TypeError("raise_err must be used as a key-word arg")
if raise_msg is None:
raise TypeError("raise_msg must be used as a key-word arg")
try:
yield
except except_errs as e:
message = "%s (raised from %s: %s)" \
% (raise_msg,
e.__class__.__name__,
str(e))
raise raise_err(message)