Python2,3: re-raise exceptions

Python2,3: re-raise exceptions

Good practice is to keep original traceback (stack-trace) when you re-raise modified exception. In Python 2 it's simple:

        try:
            return buggy()
        except Exception as x:
            cls,obj,tb = sys.exc_info()
            # modify obj OR create new the same class (cls), like here
            raise cls, SOME_ARGS, tb

In Python 3 it's simple too, but now there is a special BaseException method for this and new syntax, so:

        try:
            return buggy()
        except Exception as x:
            cls,obj,tb = sys.exc_info()
            # modify obj OR create new the same class (cls), like here
            raise cls(SOME_ARGS).with_traceback(tb)

Now to make common code compatible with Python 2 and 3 we SHOULD save it in DIFFERENT files, to avoid syntax errors when Python compile it to byte-code. For example, let's save it to 'comp2.py' and 'comp3.py'. And lets represent it as function… with signature reraise(exclass, msg, traceb). In 'comp2.py':

def reraise(exc, msg, tb):
    raise exc, msg, tb

and similar in 'comp3.py' but with withtraceback() usage. Now use it:

import sys
_PY23 = 3 if sys.version_info.major > 2 else 2
if _PY23 == 2:
    from comp2 import *
elif _PY23 == 3:
    from comp3 import *