Does the same as ordinary ``raise`` with arguments do in Python 2.
    But works in Python 3 (>= 3.3) also!

    Please checkout README on https://github.com/9seconds/pep3134
    to get an idea about possible pitfals. But short story is: please
    be pretty carefull with tracebacks. If it is possible, use sys.exc_info
    instead. But in most cases it will work as you expect.

def raise_(type_, value=None, traceback=None):  # pylint: disable=W0613
    """
    Does the same as ordinary ``raise`` with arguments do in Python 2.
    But works in Python 3 (>= 3.3) also!

    Please checkout README on https://github.com/9seconds/pep3134
    to get an idea about possible pitfals. But short story is: please
    be pretty carefull with tracebacks. If it is possible, use sys.exc_info
    instead. But in most cases it will work as you expect.
    """

    prev_exc, prev_tb = sys.exc_info()[1:]
    proxy_class = construct_exc_class(type(type_))

    err = proxy_class(type_)
    err.__original_exception__.__cause__ = None
    err.__original_exception__.__suppress_context__ = False

    if getattr(prev_exc, "__pep3134__", False):
        prev_exc = prev_exc.with_traceback(prev_tb)
    err.__original_exception__.__context__ = prev_exc

    if traceback:
        raise err.with_traceback(traceback), None, traceback
    else:
        raise err