Browse Source

Catch all exceptions in Task.__call__, so the process doesn't die.

Ask Solem 16 years ago
parent
commit
91c75f0896
1 changed files with 10 additions and 1 deletions
  1. 10 1
      celery/task.py

+ 10 - 1
celery/task.py

@@ -4,6 +4,7 @@ from celery.registry import tasks
 from celery.messaging import TaskPublisher, TaskConsumer
 from django.core.cache import cache
 from datetime import timedelta
+import traceback
 
 __all__ = ["delay_task", "discard_all", "gen_task_done_cache_key",
            "mark_as_done", "is_done", "Task", "PeriodicTask", "TestTask"]
@@ -52,7 +53,15 @@ class Task(object):
             raise NotImplementedError("Tasks must define a name attribute.")
 
     def __call__(self, **kwargs):
-        return self.run(**kwargs)
+        try:
+            retval = self.run(**kwargs)
+        except Exception, e:
+            logger = self.get_logger(**kwargs)
+            logger.critical("Task got exception %s: %s\n%s" % (
+                                e.__class__, e, traceback.format_exc()))
+            return
+        else:
+            return retval
 
     def run(self, **kwargs):
         raise NotImplementedError("Tasks must define a run method.")