পাইথনের অনুরোধগুলির মডিউলটি ব্যবহার করে / চেষ্টা করার সঠিক উপায়?


418
try:
    r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
    print e #should I also sys.exit(1) after this?

এটা কি সঠিক? এটির গঠনের আরও ভাল কোনও উপায় আছে কি? এটি কি আমার সমস্ত ঘাঁটি কভার করবে?


উত্তর:


794

অনুরোধ ব্যতিক্রম ডক্সে একবার দেখুন । সংক্ষেপে:

কোনও নেটওয়ার্ক সমস্যার ক্ষেত্রে (যেমন ডিএনএস ব্যর্থতা, সংযোগ প্রত্যাখ্যান করা ইত্যাদি) অনুরোধগুলি একটি বাড়িয়ে তুলবে 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

11
অনুরোধ গ্রন্থাগারের নির্দিষ্টকরণের সাথে ডিল করার জন্য খুব ভাল উত্তর এবং সাধারণ ব্যতিক্রম-আকর্ষণীয়।
ব্রায়ান পিটারসন

10
মনে রাখবেন যে আন্ডারলিং urllib3 লাইব্রেরিতে একটি বাগের কারণে socket.timeoutআপনি যদি সময়সীমা ব্যবহার করেন তবে আপনাকে ব্যতিক্রমগুলিও ধরতে হবে : github.com/kennethreitz/requests/issues/1236
জেবি।

15
ভবিষ্যতের মন্তব্য পাঠক: এটি অনুরোধ ২.৯-এ স্থির করা হয়েছিল (যা urllib3 1.13 বান্ডিল করে)
রাজার এম

14
আপনি HTTP চান ত্রুটি (যেমন 401 অননুমোদিত) বাড়াতে ব্যতিক্রম জন্য, আপনাকে কল করতে পারেন Response.raise_for_status । এটি কোনও HTTPError উত্থাপন করবে, যদি প্রতিক্রিয়াটি কোনও HTTP ত্রুটি ছিল।
ক্রিশ্চিয়ান লং

5
অনুরোধ ওয়েবসাইটে ব্যতিক্রম তালিকাটি সম্পূর্ণ নয়। আপনি এখানে পুরো তালিকাটি পড়তে পারেন ।
এপোক

87

স্পষ্ট করার জন্য একটি অতিরিক্ত পরামর্শ। পছন্দসই ত্রুটিটি ধরা পড়ার জন্য ত্রুটিগুলির স্ট্যাকের নিচে নির্দিষ্ট থেকে সাধারণের দিকে যাওয়া ভাল বলে মনে হয়, যাতে নির্দিষ্টটি সাধারণটির মুখোশ না পান।

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

পোস্টের জন্যও কি এই বৈধ বাক্য গঠন?
ScipioAfricanus

@ সিসিপিওআফ্রিকানাস হ্যাঁ
আন্দ্রে

10

ব্যতিক্রম অবজেক্টটিতে মূল প্রতিক্রিয়াও রয়েছে 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.