def chained(wrapping_exc):
    # pylint: disable=W0212
    """
    Embeds the current exception information into the given one (which
    will replace the current one).
    For example::

        try:
            ...
        except OSError as ex:
            raise chained(MyError("database not found!"))
    """
    t, v, tb = sys.exc_info()
    if not t:
        return wrapping_exc
    wrapping_exc._inner_exc = v
    lines = traceback.format_exception(t, v, tb)
    wrapping_exc._inner_tb = "".join(lines[1:])
    return wrapping_exc
Embeds the current exception information into the given one (which
    will replace the current one).
    For example::

        try:
            ...
        except OSError as ex:
            raise chained(MyError("database not found!"))