try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
Điều này có đúng không? Có cách nào tốt hơn để cấu trúc này? Điều này sẽ bao gồm tất cả các căn cứ của tôi?
try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
Điều này có đúng không? Có cách nào tốt hơn để cấu trúc này? Điều này sẽ bao gồm tất cả các căn cứ của tôi?
Câu trả lời:
Có một cái nhìn vào các tài liệu ngoại lệ Yêu cầu . Nói ngắn gọn:
Trong trường hợp xảy ra sự cố mạng (ví dụ: lỗi DNS, kết nối bị từ chối, v.v.), Yêu cầu sẽ đưa ra một
ConnectionError
ngoại lệ.Trong trường hợp phản hồi HTTP không hợp lệ hiếm gặp, Yêu cầu sẽ đưa ra một
HTTPError
ngoại lệ.Nếu một yêu cầu hết thời gian, một
Timeout
ngoại lệ được đưa ra.Nếu một yêu cầu vượt quá số lần chuyển hướng tối đa được định cấu hình, một
TooManyRedirects
ngoại lệ sẽ được đưa ra.Tất cả các ngoại lệ mà Yêu cầu tăng rõ ràng kế thừa từ
requests.exceptions.RequestException
.
Để trả lời câu hỏi của bạn, những gì bạn thể hiện sẽ không bao gồm tất cả các cơ sở của bạn. Bạn sẽ chỉ bắt lỗi liên quan đến kết nối, không phải là lỗi đã hết.
Phải làm gì khi bạn bắt được ngoại lệ thực sự tùy thuộc vào thiết kế kịch bản / chương trình của bạn. Có thể chấp nhận để thoát? Bạn có thể tiếp tục và thử lại không? Nếu lỗi là thảm khốc và bạn không thể tiếp tục, thì có, bạn có thể hủy bỏ chương trình của mình bằng cách nâng SystemExit (một cách hay để vừa in lỗi và gọi sys.exit
).
Bạn có thể bắt ngoại lệ lớp cơ sở, sẽ xử lý tất cả các trường hợp:
try:
r = requests.get(url, params={'s': thing})
except requests.exceptions.RequestException as e: # This is the correct syntax
raise SystemExit(e)
Hoặc bạn có thể bắt chúng một cách riêng biệt và làm những việc khác nhau.
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)
Như Christian đã chỉ ra:
Nếu bạn muốn các lỗi http (ví dụ: Không được phép 401) nêu ra các ngoại lệ, bạn có thể gọi
Response.raise_for_status
. Điều đó sẽ đưa ra mộtHTTPError
, nếu phản hồi là một lỗi http.
Một ví dụ:
try:
r = requests.get('http://www.google.com/nothere')
r.raise_for_status()
except requests.exceptions.HTTPError as err:
raise SystemExit(err)
Sẽ in:
404 Client Error: Not Found for url: http://www.google.com/nothere
socket.timeout
ngoại lệ nếu bạn đang sử dụng thời gian chờ: github.com/kennethreitz/requests/issues/1236
Một đề nghị bổ sung để được rõ ràng. Có vẻ như tốt nhất để đi từ cụ thể đến chung xuống các lỗi để nhận được lỗi mong muốn, vì vậy những lỗi cụ thể không được che dấu bởi lỗi chung.
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
đấu với
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
Đối tượng ngoại lệ cũng chứa phản hồi ban đầu e.response
, có thể hữu ích nếu cần xem phần lỗi trong phản hồi từ máy chủ. Ví dụ:
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)