2017-01-17 5 views
3

Я делаю вызов внешнего API (который является приватным, поэтому я не могу его разделить). По какой-то причине API иногда дает мне HTTPError, и иногда он возвращает то, что не соответствует остальной части моего кода, что вызывает ValueError.за исключением ValueError not triggering

for row in dataset.iter_rows(): 
    saved = True 
    while saved: 
     url = "http://api.website.com/rest/v3/search?id={0}&profile=large&format=json".format(row["id_to_search"]) 
     try: 
      r = urllib2.urlopen(url).read() 
      result = json.loads(r) 
      saved=False 
      print result 
     except urllib2.HTTPError: 
      print "too fast, waiting before retry" 
      time.sleep(3) 
     except ValueError: 
      print "################ ValueError ################" 
      time.sleep(5) 
     time.sleep(0.5) 

Однако, если я запускаю мой код еще раз, это ValueError не воскреснет для тех же строк: она, кажется, появляется в случайном порядке. Вот почему я попытался поймать его, подождать, а затем повторите попытку (см код выше), но ...:

ValueError        Traceback (most recent call last) 
<ipython-input-19-3ae7644de1fc> in <module>() 
    16   try: 
    17    r = urllib2.urlopen(url).read() 
---> 18    result = json.loads(r) 
    19    saved=False 
    20    print result 

/usr/lib64/python2.7/json/__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw) 
    336    parse_int is None and parse_float is None and 
    337    parse_constant is None and object_pairs_hook is None and not kw): 
--> 338   return _default_decoder.decode(s) 
    339  if cls is None: 
    340   cls = JSONDecoder 

/usr/lib64/python2.7/json/decoder.pyc in decode(self, s, _w) 
    363 
    364   """ 
--> 365   obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    366   end = _w(s, end).end() 
    367   if end != len(s): 

/usr/lib64/python2.7/json/decoder.pyc in raw_decode(self, s, idx) 
    381    obj, end = self.scan_once(s, idx) 
    382   except StopIteration: 
--> 383    raise ValueError("No JSON object could be decoded") 
    384   return obj, end 

ValueError: No JSON object could be decoded 

... это не зацепила. Любая идея почему?

+3

ли имя 'ValueError' назначены в текущей области? Если в вашей области есть значение «ValueError = ...», это имя больше не относится к встроенному исключению. –

+0

Я не знаю (не хорошо на Python), как я могу это проверить? –

+1

Либо у вас есть 'ValueError = ...' или 'from x import *', где модуль 'x' содержит объект с именем' ValueError'. –

ответ

2

Вы присвоили другое значение, чтобы назвать ValueError.

MCVE:

import json 
ValueError = None 
try: 
    json.loads("") 
except ValueError: 
    pass 

Исключение не ловится:

Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    File "C:\Python27\lib\json\__init__.py", line 339, in loads 
    return _default_decoder.decode(s) 
    File "C:\Python27\lib\json\decoder.py", line 364, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "C:\Python27\lib\json\decoder.py", line 382, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded