3

我正在尝试运行看起来非常简单的扫描,但我遇到了一个奇怪的异常。似乎扫描创建的生成器遇到了异常,我不知道为什么。我尝试将我的 for 循环的内部包装在 try/except 中,但它仍然会引发异常,所以我猜它在点击 es 时会死掉。如果您可以帮助确定正在发生的事情,这就是我所拥有的:

old_stuff_query = {"query": {"filtered": {
    "filter": {
        "range": {
            "expire_on": {'lte': datetime.datetime.now() - datetime.timedelta(weeks=53)}}

    }}}}

scanResp = scan(client=es, query=old_stuff_query, scroll="1m", index="myIndex", doc_type="myDoc")
counter = 0
for resp in scanResp:
    try:
        print("YAH")
    except:
        print("BOO")

但我得到以下信息:

    for resp in scanResp:
  File "/home/will/.virtualenvs/side_project/local/lib/python2.7/site-packages/elasticsearch/helpers/__init__.py", line 314, in scan
    client.clear_scroll(body={'scroll_id': [scroll_id]}, ignore=(404, ))
  File "/home/will/.virtualenvs/side_project/local/lib/python2.7/site-packages/elasticsearch/client/utils.py", line 69, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/home/will/.virtualenvs/side_project/local/lib/python2.7/site-packages/elasticsearch/client/__init__.py", line 688, in clear_scroll
    params=params, body=body)
  File "/home/will/.virtualenvs/side_project/local/lib/python2.7/site-packages/elasticsearch/transport.py", line 327, in perform_request
    status, headers, data = connection.perform_request(method, url, params, body, ignore=ignore, timeout=timeout)
  File "/home/will/.virtualenvs/side_project/local/lib/python2.7/site-packages/elasticsearch/connection/http_requests.py", line 84, in perform_request
    self._raise_error(response.status_code, raw_data)
  File "/home/will/.virtualenvs/side_project/local/lib/python2.7/site-packages/elasticsearch/connection/base.py", line 113, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
elasticsearch.exceptions.AuthorizationException: <exception str() failed>

最令人沮丧的部分是这完全是随机发生的。它在少于 10k 文档和超过 250k 文档后出现错误。任何帮助都会很棒,谢谢!

4

1 回答 1

3

所以我也有同样的错误,并找到了原因:如果你用 special 创建了一个自己的类__str__,并且在这个方法或其他调用的方法中,从它试图创建一个字符串的实例中抛出一个错误,错误消息将是用 '<exception str() failed>' 换出:

>>> class X:
...     def __str__(self):
...         raise ValueError(self)
... 
>>> print(X())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __str__
ValueError: <exception str() failed>

在您的情况下,它似乎是 api 方面的草率编程。

于 2017-11-24T15:48:44.493 回答