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?
এটা কি সঠিক? এটির গঠনের আরও ভাল কোনও উপায় আছে কি? এটি কি আমার সমস্ত ঘাঁটি কভার করবে?
উত্তর:
অনুরোধ ব্যতিক্রম ডক্সে একবার দেখুন । সংক্ষেপে:
কোনও নেটওয়ার্ক সমস্যার ক্ষেত্রে (যেমন ডিএনএস ব্যর্থতা, সংযোগ প্রত্যাখ্যান করা ইত্যাদি) অনুরোধগুলি একটি বাড়িয়ে তুলবে
ConnectionError
ব্যতিক্রম ।বিরল অবৈধ এইচটিটিপি প্রতিক্রিয়া ঘটলে, অনুরোধগুলি একটি
HTTPError
ব্যতিক্রম বাড়িয়ে তুলবে ।কোনও অনুরোধ যদি সময়সীমা বেঁধে যায় তবে একটি
Timeout
ব্যতিক্রম উত্থাপিত হবে।যদি কোনও অনুরোধটি কনফিগার হওয়া সর্বাধিক পুনর্নির্দেশের সংখ্যাকে অতিক্রম করে তবে একটি
TooManyRedirects
ব্যতিক্রম উত্থাপিত হবে।সমস্ত ব্যতিক্রমগুলি যা অনুরোধগুলি স্পষ্টতই উত্তরাধিকার সূত্রে উত্থাপন করে
requests.exceptions.RequestException
।
আপনার প্রশ্নের উত্তর দেওয়ার জন্য, আপনি যা দেখান তা আপনার সমস্ত ঘাঁটি কভার করবে না । আপনি কেবল সংযোগ-সম্পর্কিত ত্রুটিগুলিই ধরবেন, সময়টি শেষ হয়ে যাবে না।
আপনি যখন ব্যতিক্রমটি ধরেন তখন কী করবেন তা সত্যিই আপনার স্ক্রিপ্ট / প্রোগ্রামের ডিজাইনের উপর নির্ভর করে। প্রস্থানটি গ্রহণযোগ্য? আপনি কি আবার চেষ্টা করতে পারেন? যদি ত্রুটিটি বিপর্যয়কর হয় এবং আপনি আর যেতে না পারেন, তবে হ্যাঁ, আপনি সিস্টেমএক্সিট উত্থাপন করে আপনার প্রোগ্রামটি বাতিল করতে পারেন (একটি ত্রুটি মুদ্রণের জন্য দুটি উপায় এবং কল 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 অননুমোদিত) চান তবে আপনি কল করতে পারেন
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
বনাম
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)