diff --git a/mwclient/client.py b/mwclient/client.py
index 04243952d216dc91dc6e75e0e7d811df2055c183..59eba7af17e46bfd0fbccca76a8361124c76c862 100644
--- a/mwclient/client.py
+++ b/mwclient/client.py
@@ -976,19 +976,17 @@ class Site(object):
         API doc: https://semantic-mediawiki.org/wiki/Ask_API
 
         Returns:
-            Generator for retrieving all search results.
-            Iterating over the generator gives a dictionary containing the answers
-            to the query.
-            The dictionary is empty if the query is valid but there are no answers.
+            Generator for retrieving all search results, with each answer as a dictionary.
+            If the query is invalid, an APIError is raised. A valid query with zero
+            results will not raise any error.
 
         Examples:
 
             >>> query = "[[Category:my cat]]|[[Has name::a name]]|?Has property"
-            >>> answer = site.ask(query)
-            >>> for a in answer:
-            >>>     for key, value in a.items()
-            >>>         print(key)
-            >>>         print(value)
+            >>> for answer in site.ask(query):
+            >>>     for title, data in answer.items()
+            >>>         print(title)
+            >>>         print(data)
         """
         kwargs = {}
         if title is None:
@@ -998,12 +996,8 @@ class Site(object):
         while offset is not None:
             results = self.raw_api('ask', query=u'{query}|offset={offset}'.format(
                 query=query, offset=offset), http_method='GET', **kwargs)
-            if self.handle_api_result(results):
-                answer = results['query'].get('results')
-                if answer:
-                    offset = results.get('query-continue-offset')
-                    for key, value in answer.items():
-                        yield {key: value}
-                else:  # query returns no results
-                    offset = None
-                    yield {}
+            self.handle_api_result(results)  # raises APIError on error
+            offset = results.get('query-continue-offset')
+            answers = results['query'].get('results') or {}
+            for key, value in answers.items():
+                yield {key: value}
diff --git a/tests/test_client.py b/tests/test_client.py
index 1b031e4c4cd79a804a9aa8d3a03edf5dda964bdc..e4978030124876d3c0accfc17a6222648716aef6 100644
--- a/tests/test_client.py
+++ b/tests/test_client.py
@@ -299,14 +299,14 @@ class TestClient(TestCase):
         site = self.stdSetup()
         self.httpShouldReturn(json.dumps({
             'error': {
-                'query': 'Certains « <nowiki>[[</nowiki> » dans votre requête n’ont pas été clos par des « ]] » correspondants.'
+                'query': u'Certains « <nowiki>[[</nowiki> » dans votre requête n’ont pas été clos par des « ]] » correspondants.'
             }
         }), method='GET')
         with pytest.raises(mwclient.errors.APIError) as excinfo:
             list(site.ask('test'))
 
         assert excinfo.value.code is None
-        assert excinfo.value.info == 'Certains « <nowiki>[[</nowiki> » dans votre requête n’ont pas été clos par des « ]] » correspondants.'
+        assert excinfo.value.info == u'Certains « <nowiki>[[</nowiki> » dans votre requête n’ont pas été clos par des « ]] » correspondants.'
         assert len(responses.calls) == 1
 
     @responses.activate