2011-12-05 14 views
29

Parsuję dane JSON. Nie mam problemu z parsowaniem i używam modułu simplejson. Jednak niektóre żądania API zwracają pustą wartość. Oto mój przykład:Python: Handle JSON Decode Error, gdy nic nie wróciło

{ 
"all" : { 
    "count" : 0, 
    "questions" : [  ] 
    } 
} 

Jest to segment mojego kodu, gdzie I analizować obiekt json:

qByUser = byUsrUrlObj.read() 
qUserData = json.loads(qByUser).decode('utf-8') 
questionSubjs = qUserData["all"]["questions"] 

Jak już wspomniano w przypadku niektórych wniosków pojawia się następujący błąd:

Traceback (most recent call last): 
    File "YahooQueryData.py", line 164, in <module> 
    qUserData = json.loads(qByUser) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/__init__.py", line 385, in loads 
    return _default_decoder.decode(s) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/decoder.py", line 402, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/simplejson/decoder.py", line 420, in raw_decode 
    raise JSONDecodeError("No JSON object could be decoded", s, idx) 
simplejson.decoder.JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0) 

Jaki byłby najlepszy sposób na obsłużenie tego błędu?

+2

Właściwie, jakie jest twoje pytanie? – Tadeck

+0

Odpowiedziałeś na pytania;) Wygląda na to, że przedkładam pytanie, zanim naprawdę wpiszesz pytanie. Dziękuję za odpowiedź. –

+2

OK, cieszę się, że pomogłem - wygląda teraz jak telepatia;) Dzięki, że włączyłeś to pytanie. Powodzenia! – Tadeck

Odpowiedz

67

Istnieje zasada w programowaniu Pythona o nazwie „Łatwiej jest prosić o przebaczenie niż o pozwolenie” (w skrócie: EAFP). Oznacza to, że powinieneś wychwycić wyjątki zamiast sprawdzać wartości dla ważności.

Zatem, spróbuj wykonać następujące czynności:

try: 
    qByUser = byUsrUrlObj.read() 
    qUserData = json.loads(qByUser).decode('utf-8') 
    questionSubjs = qUserData["all"]["questions"] 
except ValueError: # includes simplejson.decoder.JSONDecodeError 
    print 'Decoding JSON has failed' 

EDIT: Ponieważ simplejson.decoder.JSONDecodeError faktycznie dziedziczy ValueError (proof here), I uproszczone sprawozdanie catch tylko przy użyciu ValueError.

+3

Powinieneś zawsze złapać poprawny wyjątek. W przeciwnym razie może brakować błędu w kodzie, jeśli istnieje prawdziwy wyjątek "ValueError" lub inny wyjątek, który również dziedziczy po 'ValueError'. –

+1

@JulieinAustin: Problem polega na tym, że w rzeczywistości nie masz dużego wyboru - moduł json stdliba generuje ValueError. – Tadeck

+1

Wtedy trzymałem się z dala od tego dekodera. Pierwotne pytanie dotyczyło modułu 'simplejson' i bardzo podniosło' JSONDecodeError' na złe dane wejściowe. Zobacz swój wcześniejszy link. –