Skip to content
Snippets Groups Projects
G

gracedb-client

Project ID: 2606
Leo Singer's avatar
Leo P. Singer authored
According to the [Celery manual]:

> A rarely known Python fact is that exceptions must conform to
> some simple rules to support being serialized by the pickle
> module.
>
> Tasks that raise exceptions that aren’t pickleable won’t work
> properly when Pickle is used as the serializer.
>
> To make sure that your exceptions are pickleable the exception
> MUST provide the original arguments it was instantiated with in
> its .args attribute. The simplest way to ensure this is to have
> the exception call Exception.__init__.

The class `ligo.gracedb.exceptions.HTTPError` does not follow
these rules, so it is not pickleable. Here is a demonstration of
that:

    >>> import pickle
    >>> from ligo.gracedb.exceptions import HTTPError
    >>> pickle.loads(pickle.dumps(HTTPError(404, 'foo', 'bar')))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: __init__() missing 2 required positional arguments:
    'reason' and 'message'

This patch makes `HTTPError` pickleable so that it can be properly
represented in Celery task stack traces.

[Celery manual]: http://docs.celeryproject.org/en/latest/userguide/tasks.html#creating-pickleable-exceptions
dd107fa3
History