python এক লাইনে একাধিক ব্যতিক্রম ধরা(ব্লক ব্যতীত)




exception exception-handling (6)

আমি জানি যে আমি করতে পারি:

try:
    # do something that may fail
except:
    # do this if ANYTHING goes wrong

আমি এটাও করতে পারি

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreTooShortException:
    # stand on a ladder

কিন্তু যদি আমি একই জিনিসটি দুটি ভিন্ন ব্যতিক্রমগুলির মধ্যে করতে চাই, তবে এখনই আমি এই বিষয়ে চিন্তা করতে পারব:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreBeingMeanException:
    # say please

আমি কি এমন কিছু করতে পারি যা আমি ভালো কিছু করতে পারি (যেহেতু উভয় ব্যতিক্রমগুলি গ্রহণ করার জন্য say please ):

try:
    # do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
    # say please

এখন এটি সত্যিই কাজ করবে না, কারণ এটি সিনট্যাক্সের সাথে মেলে:

try:
    # do something that may fail
except Exception, e:
    # say please

সুতরাং, দুটি স্বতন্ত্র ব্যতিক্রম ধরা আমার প্রচেষ্টা ঠিক মাধ্যমে আসে না।

এই কাজ করতে একটি উপায় আছে কি?


এটি করার উপায় এক ..

try:
   You do your operations here;
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

এবং আরেকটি উপায় হল এমন একটি পদ্ধতি তৈরি করা যা ব্যবধান except নির্বাহিত কার্য সম্পাদন করে এবং আপনি যে সমস্ত ব্লকটি লিখছেন তার মাধ্যমে কল করুন।

try:
   You do your operations here;
   ......................
except Exception1:
    functionname(parameterList)
except Exception2:
    functionname(parameterList)
except Exception3:
    functionname(parameterList)
else:
   If there is no exception then execute this block. 

def functionname( parameters ):
   //your task..
   return [expression]

আমি জানি যে দ্বিতীয়টি এটি করার সর্বোত্তম উপায় নয়, তবে আমি এই জিনিসটি করার কয়েকটি উপায় দেখছি।


আমি কিভাবে এক লাইনে একাধিক ব্যতিক্রম ধরতে পারি (ব্লক ব্যতীত)

এটা কর:

try:
    may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
    handle(error) # might log or have some other default behavior...

বন্ধনীটি পুরোনো সিনট্যাক্সের কারণে প্রয়োজন যা ত্রুটি নামটিকে একটি নামের মধ্যে বরাদ্দ করতে কমা ব্যবহার করে। as শব্দ অ্যাসাইনমেন্ট জন্য ব্যবহার করা হয়। আপনি ত্রুটি বস্তুর জন্য কোনও নাম ব্যবহার করতে পারেন, আমি ব্যক্তিগতভাবে error পছন্দ করি।

ভাল অভ্যাস

বর্তমানে Python এর সাথে সামঞ্জস্যপূর্ণভাবে এবং এগিয়ে যাওয়ার জন্য, আপনাকে ব্যতিক্রমগুলির সাথে কমাগুলি আলাদা করতে হবে এবং পূর্ববর্তী সিনট্যাক্স থেকে আলাদা করার জন্য বন্ধনীগুলির সাথে মোড়ানো দরকার যা একটি পরিবর্তনশীল নামের ব্যতিক্রম ব্যতিক্রমটি অনুসরণ করে ব্যতিক্রমযুক্ত টাইপ অনুসরণ করে কমা।

এখানে সহজ ব্যবহার একটি উদাহরণ:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
    quit(0)

আমি শুধু এই ব্যতিক্রমগুলি নির্দিষ্ট করছি যা বাগ লুকানোর এড়াতে, যা আমি সম্মুখীন হলে আমি সম্পূর্ণ স্ট্যাক ট্রেস আশা করি।

এটি এখানে নথিভুক্ত করা হয়েছে: https://docs.python.org/tutorial/errors.html

আপনি একটি পরিবর্তনশীলের জন্য ব্যতিক্রম বরাদ্দ করতে পারেন, ( e সাধারণ, তবে আপনি যদি দীর্ঘ ব্যতিক্রম ব্যতিক্রম হ্যান্ডলিং না করেন তবে আপনার ওয়ার্ডোজ ভেরিয়েবল পছন্দ করতে পারেন অথবা আপনার আইডিই কেবল তার চেয়ে বড় নির্বাচনগুলি হাইলাইট করে।) উদাহরণটিতে একটি যুক্তিযুক্ত বৈশিষ্ট্য রয়েছে। এখানে একটি উদাহরণ:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    quit(0)

উল্লেখ্য যে পাইথন 3-তে, err অবরোধটি শেষ হওয়ার সময় err বস্তুটি হ্রাস পায়।

অননুমোদিত

আপনি কোড দেখতে পারেন যা একটি কমা দিয়ে ত্রুটিটি বরাদ্দ করে। এই ব্যবহারটি, পাইথন 2.5 এবং এর আগে উপলব্ধ একমাত্র ফর্ম, অব্যবহৃত, এবং যদি আপনি আপনার কোডটি পাইথন 3 এ সামঞ্জস্যপূর্ণ হতে চান তবে নতুন ফর্মটি ব্যবহার করার জন্য আপনাকে সিনট্যাক্সটি আপডেট করতে হবে:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
    print err
    print err.args
    quit(0)

আপনি যদি আপনার কোডবেসে কমা নাম বরাদ্দ দেখেন, এবং আপনি পাইথন 2.5 বা উচ্চতর ব্যবহার করেন তবে এটি করার নতুন পদ্ধতিতে স্যুইচ করুন যাতে আপগ্রেড করার সময় আপনার কোড সামঞ্জস্যপূর্ণ থাকে।

suppress প্রসঙ্গে ম্যানেজার

গ্রহণযোগ্য উত্তর সত্যিই কোড 4 লাইন, সর্বনিম্ন:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

প্রাইভেস কনসেনট্যান্ট ম্যানেজারের সাথে এক লাইনে পাইনথ 3.4 এ উপলব্ধ লাইনের পাশাপাশি try :

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

সুতরাং যখন আপনি নির্দিষ্ট ব্যতিক্রমগুলি pass করতে চান, তখন suppress ব্যবহার করুন।


যদি আপনি প্রায়শই ব্যতিক্রমগুলির একটি বড় সংখ্যা ব্যবহার করেন তবে আপনি একটি টিপলটি পূর্ব-সংজ্ঞায়িত করতে পারেন, তাই আপনাকে সেগুলি আবার টাইপ করতে হবে না।

#This example code is a technique I use in a library that connects with websites to gather data

ConnectErrs  = (URLError, SSLError, SocketTimeoutError, BadStatusLine, ConnectionResetError)

def connect(url, data):
    #do connection and return some data
    return(received_data)

def some_function(var_a, var_b, ...):
    try: o = connect(url, data)
    except ConnectErrs as e:
        #do the recovery stuff
    blah #do normal stuff you would do if no exception occurred

নোট:

  1. যদি আপনি, পূর্ব-সংজ্ঞায়িত টিপলেগুলির তুলনায় অন্যান্য ব্যতিক্রমগুলি ধরতে চান তবে আপনাকে ব্লক ছাড়া অন্যকে সংজ্ঞায়িত করতে হবে।

  2. আপনি যদি শুধুমাত্র গ্লোবাল ভেরিয়েবল সহ্য করতে না পারেন তবে এটি মূল () এ সংজ্ঞায়িত করুন এবং প্রয়োজনীয় যেখানে এটি প্রায় পাস করুন ...


পাইথন ডকুমেন্টেশন থেকে -> 8.3 হ্যান্ডলিং ব্যতিক্রমসমূহ :

বিভিন্ন ব্যতিক্রমগুলির জন্য হ্যান্ডলারগুলি নির্দিষ্ট করার জন্য একটি try বিবৃতিটি ব্যতীত একাধিক থাকতে পারে। সর্বাধিক এক হ্যান্ডলার মৃত্যুদন্ড কার্যকর করা হবে। হ্যান্ডলার শুধুমাত্র একই চেষ্টা বিবৃতি অন্যান্য হ্যান্ডলার মধ্যে, সংশ্লিষ্ট চেষ্টা ধারা মধ্যে ব্যতিক্রম ব্যতিক্রম হ্যান্ডেল। অনুচ্ছেদ ব্যতীত একটি বন্ধনীযুক্ত টুপল হিসাবে একাধিক ব্যতিক্রম নামকরণ করতে পারে, উদাহরণস্বরূপ:

except (RuntimeError, TypeError, NameError):
    pass

উল্লেখ্য যে এই ValueError, e: চারপাশে বন্ধনীগুলি প্রয়োজন বোধ করা হয়, কারণ ValueError, e: ব্যতীত ValueError, e: ছাড়া যা সাধারণত লিখিত হয় তার জন্য সিনট্যাক্স ব্যবহার করা হয়েছে except ValueError as e: আধুনিক পাইথন (নীচে বর্ণিত) এ। পুরাতন সিনট্যাক্স এখনও পিছনে সামঞ্জস্যের জন্য সমর্থিত। এর মানে except RuntimeError, TypeError সমান নয় except (RuntimeError, TypeError): কিন্তু except RuntimeError as যা TypeError: যা চান তা নয়।


পাইথন 2.7 ডকুমেন্টেশন বলে যে:

বিভিন্ন ব্যতিক্রমগুলির জন্য হ্যান্ডলারগুলি নির্দিষ্ট করার জন্য একটি প্রচেষ্টা বিবৃতিটি ব্যতীত একাধিক থাকতে পারে। সর্বাধিক এক হ্যান্ডলার মৃত্যুদন্ড কার্যকর করা হবে। হ্যান্ডলার শুধুমাত্র একই চেষ্টা বিবৃতি অন্যান্য হ্যান্ডলার মধ্যে, সংশ্লিষ্ট চেষ্টা ধারা মধ্যে ব্যতিক্রম ব্যতিক্রম হ্যান্ডেল। অনুচ্ছেদ ব্যতীত একটি বন্ধনীযুক্ত টুপল হিসাবে একাধিক ব্যতিক্রম নামকরণ করতে পারে, উদাহরণস্বরূপ:

try:
    raise ValueError("hello")
except (RuntimeError, ValueError, KeyError) as a:
    print a

উল্লেখ্য যে এই টুপলের চারপাশে বন্ধনীগুলি প্রয়োজন বোধ করা হয়, কারণ মান ভেরোরির ব্যতীত, ই: মানিরেরর ছাড়া যা সাধারণত লিখিত হয় তার জন্য সিনট্যাক্স ব্যবহার করা হয়েছে: আধুনিক পাইথন (নীচে বর্ণিত) এ। পুরাতন সিনট্যাক্স এখনও পিছনে সামঞ্জস্যের জন্য সমর্থিত। এর মানে রানটাইম ইরেকর ব্যতীত, টাইপ ইরেকরটি ব্যতীত সমান নয় (রানটাইম ইরার, টাইপ ইরেকর): কিন্তু টাইটাইরের হিসাবে রানটাইম ইরার ছাড়া যা: আপনি যা চান তা নয়।


পাইথন ডকুমেন্টেশন থেকে:

উদাহরণ ব্যতীত, একটি বন্ধনীযুক্ত টিপল হিসাবে একাধিক ব্যতিক্রম নামকরণ করতে পারে

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

অথবা, পাইথন 2 শুধুমাত্র জন্য:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

একটি কমা দ্বারা পরিবর্তনশীল থেকে ব্যতিক্রম পৃথক করা এখনও Python 2.6 এবং 2.7 এ কাজ করবে, কিন্তু এখন অব্যবহৃত এবং পাইথন 3 তে কাজ করে না; এখন আপনি as ব্যবহার as উচিত।







exception-handling