copyparty/copyparty/broker_util.py

40 lines
877 B
Python

# coding: utf-8
from __future__ import print_function, unicode_literals
import traceback
from .util import Pebkac, Queue
class ExceptionalQueue(Queue, object):
def get(self, block=True, timeout=None):
rv = super(ExceptionalQueue, self).get(block, timeout)
# TODO: how expensive is this?
if isinstance(rv, list):
if rv[0] == "exception":
if rv[1] == "pebkac":
raise Pebkac(*rv[2:])
else:
raise Exception(rv[2])
return rv
def try_exec(want_retval, func, *args):
try:
return func(*args)
except Pebkac as ex:
if not want_retval:
raise
return ["exception", "pebkac", ex.code, str(ex)]
except:
if not want_retval:
raise
return ["exception", "stack", traceback.format_exc()]