by reading this I just learned about the concept of chained exceptions, although I can't see why is so useful, the built-in traceback and sys module has always been good enough:
import sys,traceback
try:
...
except Exception as ex:
exc_type, exc_value, exc_traceback = sys.exc_info()
logger.error("%s:%s" % (str(ex), str(traceback.format_exception(exc_type, exc_value, exc_traceback))))
raise MyException(" :( ")