diff --git a/django/db/models/query.py b/django/db/models/query.py
index 0f3a79a..4478c2a 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -302,44 +302,48 @@ class QuerySet(object):
         if fill_cache:
             klass_info = get_klass_info(model, max_depth=max_depth,
                                         requested=requested, only_load=only_load)
-        for row in compiler.results_iter():
-            if fill_cache:
-                obj, _ = get_cached_row(row, index_start, db, klass_info,
-                                        offset=len(aggregate_select))
-            else:
-                # Omit aggregates in object creation.
-                row_data = row[index_start:aggregate_start]
-                if skip:
-                    obj = model_cls(**dict(zip(init_list, row_data)))
+        try:
+            for row in compiler.results_iter():
+                if fill_cache:
+                    obj, _ = get_cached_row(row, index_start, db, klass_info,
+                                            offset=len(aggregate_select))
                 else:
-                    obj = model(*row_data)
-
-                # Store the source database of the object
-                obj._state.db = db
-                # This object came from the database; it's not being added.
-                obj._state.adding = False
-
-            if extra_select:
-                for i, k in enumerate(extra_select):
-                    setattr(obj, k, row[i])
-
-            # Add the aggregates to the model
-            if aggregate_select:
-                for i, aggregate in enumerate(aggregate_select):
-                    setattr(obj, aggregate, row[i + aggregate_start])
-
-            # Add the known related objects to the model, if there are any
-            if self._known_related_objects:
-                for field, rel_objs in self._known_related_objects.items():
-                    pk = getattr(obj, field.get_attname())
-                    try:
-                        rel_obj = rel_objs[pk]
-                    except KeyError:
-                        pass               # may happen in qs1 | qs2 scenarios
+                    # Omit aggregates in object creation.
+                    row_data = row[index_start:aggregate_start]
+                    if skip:
+                        obj = model_cls(**dict(zip(init_list, row_data)))
                     else:
-                        setattr(obj, field.name, rel_obj)
-
-            yield obj
+                        obj = model(*row_data)
+
+                    # Store the source database of the object
+                    obj._state.db = db
+                    # This object came from the database; it's not being added.
+                    obj._state.adding = False
+
+                if extra_select:
+                    for i, k in enumerate(extra_select):
+                        setattr(obj, k, row[i])
+
+                # Add the aggregates to the model
+                if aggregate_select:
+                    for i, aggregate in enumerate(aggregate_select):
+                        setattr(obj, aggregate, row[i + aggregate_start])
+
+                # Add the known related objects to the model, if there are any
+                if self._known_related_objects:
+                    for field, rel_objs in self._known_related_objects.items():
+                        pk = getattr(obj, field.get_attname())
+                        try:
+                            rel_obj = rel_objs[pk]
+                        except KeyError:
+                            pass               # may happen in qs1 | qs2 scenarios
+                        else:
+                            setattr(obj, field.name, rel_obj)
+
+                yield obj
+        except Exception:
+            self._result_cache = None
+            raise
 
     def aggregate(self, *args, **kwargs):
         """
