Ug, darn, that's right. Well, here's (approximately) how six.py handles it… so @shazow can make the call on whether or not he wants to use it:

```python

if PY3:
    def reraise(tp, value, tb=None):
        if value.__traceback__ is not tb:
            raise value.with_traceback(tb)
        raise value
else:
    _g = {}
    exec "def reraise(tp, value, tb=None): raise tp, value, tb" in _g
    reraise = _g['reraise']
    del _g
```