Skip to content

Make HTTPError pickleable

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.

Merge request reports