Index: docs/topics/signals.txt
===================================================================
--- docs/topics/signals.txt	(revision 16391)
+++ docs/topics/signals.txt	(working copy)
@@ -248,19 +248,28 @@
             pizza_done.send(sender=self, toppings=toppings, size=size)
             ...
 
-Both ``send()`` and ``send_robust()`` return a list of tuple pairs
-``[(receiver, response), ... ]``, representing the list of called receiver
-functions and their response values.
+``send()`` returns a list of tuple pairs ``[(receiver, response), ... ]``,
+representing the list of called receiver functions and their response values.
 
 ``send()`` differs from ``send_robust()`` in how exceptions raised by receiver
 functions are handled. ``send()`` does *not* catch any exceptions raised by
-receivers; it simply allows errors to propagate. Thus not all receivers may
-be notified of a signal in the face of an error.
+receivers; it simply allows errors to propagate. Thus not all receivers may be
+notified of a signal in the face of an error.
 
-``send_robust()`` catches all errors derived from Python's ``Exception`` class,
-and ensures all receivers are notified of the signal. If an error occurs, the
-error instance is returned in the tuple pair for the receiver that raised the error.
+``send_robust()``, on the other hand, catches all errors derived from Python's
+``Exception`` class, and ensures all receivers are notified of the signal.
 
+For receivers that run without raising an exception, ``send_robust()`` appends a
+tuple pair ``(receiver, response)`` to the returned list, just like ``send()``. If
+an error occurs, however, a three tuple ``(receiver, error, traceback)`` is appended
+to the list instead. This tuple contains the receiver that had an error, the
+``Exception`` instance raised by that receiver, and a ``traceback`` object with the
+call stack at the point where the exception occurred.
+
+.. versionchanged:: 1.4
+   A ``traceback`` object was added to the tuple that is appended to the returned
+   list in ``send_robust()`` when an exception is raised by a receiver function.
+
 Disconnecting signals
 =====================
 
Index: django/dispatch/dispatcher.py
===================================================================
--- django/dispatch/dispatcher.py	(revision 16391)
+++ django/dispatch/dispatcher.py	(working copy)
@@ -1,5 +1,6 @@
 import weakref
 import threading
+import sys
 
 from django.dispatch import saferef
 
@@ -206,7 +207,13 @@
             try:
                 response = receiver(signal=self, sender=sender, **named)
             except Exception, err:
-                responses.append((receiver, err))
+                # Wrap traceback in try...finally to prevent circular reference
+                # See warning at http://docs.python.org/library/sys.html#sys.exc_info
+                try:
+                    traceback = sys.exc_info()[2]
+                    responses.append((receiver, err, traceback))
+                finally:
+                    del traceback
             else:
                 responses.append((receiver, response))
         return responses
Index: tests/regressiontests/dispatch/tests/test_dispatcher.py
===================================================================
--- tests/regressiontests/dispatch/tests/test_dispatcher.py	(revision 16391)
+++ tests/regressiontests/dispatch/tests/test_dispatcher.py	(working copy)
@@ -1,5 +1,6 @@
 import gc
 import sys
+from types import TracebackType
 
 from django.dispatch import Signal
 from django.utils import unittest
@@ -98,7 +99,9 @@
         a_signal.connect(fails)
         result = a_signal.send_robust(sender=self, val="test")
         err = result[0][1]
+        traceback = result[0][2]
         self.assertTrue(isinstance(err, ValueError))
+        self.assertTrue(isinstance(traceback, TracebackType))
         self.assertEqual(err.args, ('this',))
         a_signal.disconnect(fails)
         self._testIsClean(a_signal)
