forked from M-Labs/artiq
43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
import inspect
|
|
import builtins
|
|
import traceback
|
|
import sys
|
|
|
|
|
|
__all__ = ["GenericRemoteException", "current_exc_packed", "raise_packed_exc"]
|
|
|
|
|
|
class GenericRemoteException(Exception):
|
|
pass
|
|
|
|
|
|
builtin_exceptions = {v: k for k, v in builtins.__dict__.items()
|
|
if inspect.isclass(v) and issubclass(v, BaseException)}
|
|
|
|
|
|
def current_exc_packed():
|
|
exc_class, exc, exc_tb = sys.exc_info()
|
|
if exc_class in builtin_exceptions:
|
|
return {
|
|
"class": builtin_exceptions[exc_class],
|
|
"message": str(exc),
|
|
"traceback": traceback.format_tb(exc_tb)
|
|
}
|
|
else:
|
|
message = traceback.format_exception_only(exc_class, exc)[0].rstrip()
|
|
return {
|
|
"class": "GenericRemoteException",
|
|
"message": message,
|
|
"traceback": traceback.format_tb(exc_tb)
|
|
}
|
|
|
|
|
|
def raise_packed_exc(pack):
|
|
if pack["class"] == "GenericRemoteException":
|
|
cls = GenericRemoteException
|
|
else:
|
|
cls = getattr(builtins, pack["class"])
|
|
exc = cls(pack["message"])
|
|
exc.parent_traceback = pack["traceback"]
|
|
raise exc
|