2017-02-21 147 views
2

向服務器發出請求,如下面的代碼所示,我得到了狀態碼500,該狀態碼未被捕獲爲異常。輸出是「500」,但我需要所有的500代碼導致sys.exit()。 requests.exceptions.RequestException是否將500作爲異常處理或者是其他事情?請求模塊文檔http://docs.python-requests.org/en/latest/user/quickstart/#errors-and-exceptions對於該類下的內容並不十分清楚。我如何確保所有的500代碼導致sys.exit()?狀態碼500不被視爲異常

import requests 
import json 
import sys 

url = http://www.XXXXXXXX.com 
headers = {'user':'me'} 
try: 
    r = requests.post(url, headers=headers) 
    status = r.status_code 
    response = json.dumps(r.json(), sort_keys=True, separators=(',', ': ')) 
    print status 
except requests.exceptions.RequestException as e: 
    print "- ERROR - Web service exception, msg = {}".format(e) 
    if r.status_code < 500: 
     print r.status_code 
    else: 
     sys.exit(-1) 
+1

這是在'for'循環中嗎? 'for'塊外的'continue'是一個語法錯誤,你想'pass'嗎? –

+0

正確,我編輯了這個問題 - 謝謝! – postoronnim

回答

3

狀態碼500不是例外。處理請求時服務器出錯,服務器返回500;服務器比請求更多的問題。

可以因此與try-except做掉:

r = requests.post(url, headers=headers) 
status = r.status_code 
response = json.dumps(r.json(), sort_keys=True, separators=(',', ': ')) 

if str(status).startswith('5'): 
    ... 
+1

除非在這種情況下,如果它是501或任何其他代碼,則必須在每個500以上的數字中編碼。只有在知道服務器返回的響應代碼時纔有用,保證 – jarcobi889

+0

@ jarcobi889答案更新!感謝您的注意。 –

+0

很好的修復!我沒有想到這個 – jarcobi889

1

Requests documentation

如果我們做了一個壞的請求(4XX客戶端錯誤或5XX服務器錯誤 響應),我們可以Response.raise_for_status()提出來:

>>> bad_r = requests.get('http://httpbin.org/status/404') 
>>> bad_r.status_code 
404 

>>> bad_r.raise_for_status() 
Traceback (most recent call last): 
    File "requests/models.py", line 832, in raise_for_status 
    raise http_error 
requests.exceptions.HTTPError: 404 Client Error 

所以,我們Ë

r = requests.post(url, headers=headers) 
try: 
    r.raise_for_status() 
except requests.exceptions.HTTPError: 
    # Gave a 500 or 404 
else: 
    # Move on with your life! Yay! 
+0

可悲的是,他們只想要500個,不是所有的錯誤 –

+0

真,但「所有500個代碼」可能意味着501或503或其他。這也捕獲了這些也沒有硬編碼500和600之間的每個數字 – jarcobi889

+0

我認爲服務器配置爲只返回500「的所有500家庭。所有的優點,傢伙 - 謝謝。接受摩西是最直接的。 – postoronnim

2

如果你想有一個成功的請求,但 「不OK」 響應引發錯誤,call response.raise_for_status()。然後您可以捕獲該錯誤並進行適當的處​​理。它將引發一個requests.exceptions.HTTPError,其中response對象掛在該錯誤上。

相關問題