try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
ถูกต้องหรือไม่ มีวิธีที่ดีกว่าในการจัดโครงสร้างสิ่งนี้หรือไม่? สิ่งนี้จะครอบคลุมฐานทั้งหมดของฉันหรือไม่
try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
ถูกต้องหรือไม่ มีวิธีที่ดีกว่าในการจัดโครงสร้างสิ่งนี้หรือไม่? สิ่งนี้จะครอบคลุมฐานทั้งหมดของฉันหรือไม่
คำตอบ:
มีลักษณะที่ร้องขอเอกสารข้อยกเว้น ในระยะสั้น:
ในกรณีที่เกิดปัญหาเครือข่าย (เช่น DNS ล้มเหลวปฏิเสธการเชื่อมต่อ ฯลฯ ) คำขอจะเพิ่ม
ConnectionError
ข้อยกเว้นในกรณีที่การตอบสนอง HTTP ที่ไม่ถูกต้องหายากคำขอจะเพิ่ม
HTTPError
ข้อยกเว้นหากคำขอหมดเวลาจะมี
Timeout
ข้อยกเว้นเกิดขึ้นหากคำขอเกินจำนวนการเปลี่ยนเส้นทางสูงสุดที่กำหนดไว้
TooManyRedirects
จะมีการยกข้อยกเว้น
requests.exceptions.RequestException
ข้อยกเว้นทั้งหมดที่จองอย่างชัดเจนยกมรดกจาก
เพื่อตอบคำถามของคุณสิ่งที่คุณแสดงจะไม่ครอบคลุมฐานทั้งหมดของคุณ คุณจะตรวจพบข้อผิดพลาดเกี่ยวกับการเชื่อมต่อไม่ใช่ข้อผิดพลาด
สิ่งที่ต้องทำเมื่อคุณตรวจพบข้อยกเว้นนั้นขึ้นอยู่กับการออกแบบของสคริปต์ / โปรแกรมของคุณ สามารถออกได้หรือไม่? คุณสามารถไปลองอีกครั้งได้ไหม? หากข้อผิดพลาดเป็นความหายนะและคุณไม่สามารถดำเนินการต่อได้คุณอาจยกเลิกโปรแกรมของคุณโดยเพิ่มSystemExit (เป็นวิธีที่ดีในการพิมพ์ข้อผิดพลาดและการโทรsys.exit
)
คุณสามารถตรวจจับข้อยกเว้นระดับฐานซึ่งจะจัดการทุกกรณี:
try:
r = requests.get(url, params={'s': thing})
except requests.exceptions.RequestException as e: # This is the correct syntax
raise SystemExit(e)
หรือคุณสามารถจับมันแยกจากกันและทำสิ่งต่าง ๆ
try:
r = requests.get(url, params={'s': thing})
except requests.exceptions.Timeout:
# Maybe set up for a retry, or continue in a retry loop
except requests.exceptions.TooManyRedirects:
# Tell the user their URL was bad and try a different one
except requests.exceptions.RequestException as e:
# catastrophic error. bail.
raise SystemExit(e)
ดังที่คริสเตียนชี้ให้เห็น:
หากคุณต้องการข้อผิดพลาด http (เช่น 401 Unauthorized) เพื่อเพิ่มข้อยกเว้นคุณสามารถโทร
Response.raise_for_status
ได้ ที่จะยกHTTPError
ถ้าการตอบสนองข้อผิดพลาด http
ตัวอย่าง:
try:
r = requests.get('http://www.google.com/nothere')
r.raise_for_status()
except requests.exceptions.HTTPError as err:
raise SystemExit(err)
จะพิมพ์:
404 Client Error: Not Found for url: http://www.google.com/nothere
socket.timeout
ข้อยกเว้นหากคุณใช้หมดเวลา: github.com/kennethreitz/requests/issues/1236
หนึ่งข้อเสนอแนะเพิ่มเติมที่จะชัดเจน ดูเหมือนว่าจะเป็นการดีที่สุดที่จะเปลี่ยนจากข้อผิดพลาดทั่วไปเป็นข้อผิดพลาดทั่วไปเพื่อให้ได้ข้อผิดพลาดที่ต้องการดังนั้นบุคคลทั่วไปจะไม่ถูกหลอกลวงโดยทั่วไป
url='http://www.google.com/blahblah'
try:
r = requests.get(url,timeout=3)
r.raise_for_status()
except requests.exceptions.HTTPError as errh:
print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
print ("Timeout Error:",errt)
except requests.exceptions.RequestException as err:
print ("OOps: Something Else",err)
Http Error: 404 Client Error: Not Found for url: http://www.google.com/blahblah
VS
url='http://www.google.com/blahblah'
try:
r = requests.get(url,timeout=3)
r.raise_for_status()
except requests.exceptions.RequestException as err:
print ("OOps: Something Else",err)
except requests.exceptions.HTTPError as errh:
print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
print ("Timeout Error:",errt)
OOps: Something Else 404 Client Error: Not Found for url: http://www.google.com/blahblah
วัตถุข้อยกเว้นยังประกอบด้วยการตอบกลับดั้งเดิมe.response
ซึ่งอาจมีประโยชน์หากต้องการดูเนื้อหาของข้อผิดพลาดในการตอบสนองจากเซิร์ฟเวอร์ ตัวอย่างเช่น:
try:
r = requests.post('somerestapi.com/post-here', data={'birthday': '9/9/3999'})
r.raise_for_status()
except requests.exceptions.HTTPError as e:
print (e.response.text)