python - সহজ - পাইথন ম্যানুয়ালি একটি throwing(নিক্ষেপ)




সহজ ভাষায় পাইথন ৩ pdf (4)

কিভাবে আমি পাইথনে একটি ব্যতিক্রম বাড়াতে পারি যাতে এটি পরে ব্লক except ধরা পড়তে পারে?


আমি কিভাবে পাইথন ম্যানুয়ালি একটি নিক্ষেপ / বাড়াতে পারি?

সর্ম্পকে আপনার সমস্যাটি ফিট করে এমন সর্বাধিক নির্দিষ্ট ব্যতিক্রম কন্সট্রকটারটি ব্যবহার করুন

আপনার বার্তা নির্দিষ্ট করা, উদাহরণস্বরূপ:

raise ValueError('A very specific bad thing happened.')

জেনেরিক ব্যতিক্রম বাড়াতে না

একটি জেনেরিক ব্যতিক্রম উত্থাপন এড়াতে। এটি ধরতে, আপনাকে এটির সমস্ত উপসর্গগুলি ধরতে হবে যা এটি উপবিষ্ট করে।

সমস্যা 1: বাগ লুকানো

raise Exception('I know Python!') # Don't! If you catch, likely to hide bugs.

উদাহরণ স্বরূপ:

def demo_bad_catch():
    try:
        raise ValueError('Represents a hidden bug, do not catch this')
        raise Exception('This is the exception you expect to handle')
    except Exception as error:
        print('Caught this error: ' + repr(error))

>>> demo_bad_catch()
Caught this error: ValueError('Represents a hidden bug, do not catch this',)

সমস্যা 2: ধরা হবে না

এবং আরো নির্দিষ্ট ক্যাচ সাধারণ ব্যতিক্রম ধরা হবে না:

def demo_no_catch():
    try:
        raise Exception('general exceptions not caught by specific handling')
    except ValueError as e:
        print('we will not catch exception: Exception')


>>> demo_no_catch()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in demo_no_catch
Exception: general exceptions not caught by specific handling

সেরা অনুশীলন: বিবৃতি raise

এর পরিবর্তে, সর্বাধিক নির্দিষ্ট ব্যতিক্রম কন্সট্রকটারটি ব্যবহার করুন যা আপনার সমস্যার সাথে সামঞ্জস্যপূর্ণভাবে ফিট করে

raise ValueError('A very specific bad thing happened')

যা হস্তান্তরকারীকে নির্বিচারে আর্গুমেন্টগুলি হস্তান্তর করার অনুমতি দেয়:

raise ValueError('A very specific bad thing happened', 'foo', 'bar', 'baz') 

এই আর্গুমেন্ট ব্যতিক্রম বস্তুর উপর args বৈশিষ্ট্য দ্বারা অ্যাক্সেস করা হয়। উদাহরণ স্বরূপ:

try:
    some_code_that_may_raise_our_value_error()
except ValueError as err:
    print(err.args)

কপি করে প্রিন্ট

('message', 'foo', 'bar', 'baz')    

পাইথন 2.5 এ, ব্যতিক্রমগুলি উপবিষ্ট করার এবং আর্গুমেন্টগুলি ব্যবহার বন্ধ করা ব্যবহারকারীদের উত্সাহিত করার পক্ষে বেসেক্সপেশনে একটি প্রকৃত message বৈশিষ্ট্য যোগ করা হয়েছিল, কিন্তু message প্রবর্তন এবং আর্গুমেন্টগুলির মূল অবনতি প্রত্যাহার করা হয়েছে

সর্বোত্তম অনুশীলন: ধারা except

যখন কোনও অনুচ্ছেদ ব্যতীত, আপনি চাইবেন, উদাহরণস্বরূপ, একটি নির্দিষ্ট ধরনের ত্রুটি ঘটেছে তা লগ ইন করুন এবং তারপরে পুনঃ-উত্থাপন করুন। স্ট্যাক ট্রেস সংরক্ষণ করার সময় এটি করার সর্বোত্তম উপায় একটি বেয়ার বাড়া বিবৃতি ব্যবহার করা। উদাহরণ স্বরূপ:

logger = logging.getLogger(__name__)

try:
    do_something_in_app_that_breaks_easily()
except AppError as error:
    logger.error(error)
    raise                 # just this!
    # raise AppError      # Don't do this, you'll lose the stack trace!

আপনার ত্রুটি সংশোধন করবেন না ... কিন্তু যদি আপনি জোর দেন।

আপনি sys.exc_info() ) এর সাথে sys.exc_info() (এবং ত্রুটি মান) সংরক্ষণ করতে পারেন, তবে এই sys.exc_info() আরও ত্রুটিযুক্ত এবং Python 2 এবং 3 এর মধ্যে সামঞ্জস্যের সমস্যা রয়েছে , পুনঃ-উত্থাপন করতে একটি বেড়া raise ব্যবহার করতে পছন্দ করে।

ব্যাখ্যা করতে - sys.exc_info() টাইপ, মান এবং ট্রেসব্যাক প্রদান করে।

type, value, traceback = sys.exc_info()

পাইথন 2 এ সিনট্যাক্স - নোটটি পাইথন 3 এর সাথে সামঞ্জস্যপূর্ণ নয়:

    raise AppError, error, sys.exc_info()[2] # avoid this.
    # Equivalently, as error *is* the second object:
    raise sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]

আপনি যদি চান তবে আপনার নতুন উত্থানের সাথে কী ঘটতে পারে তা সংশোধন করতে পারেন - যেমন উদাহরণের জন্য নতুন আর্গুমেন্ট স্থাপন করা:

def error():
    raise ValueError('oops!')

def catch_error_modify_message():
    try:
        error()
    except ValueError:
        error_type, error_instance, traceback = sys.exc_info()
        error_instance.args = (error_instance.args[0] + ' <modification>',)
        raise error_type, error_instance, traceback

এবং args সংশোধন করার সময় আমরা পুরো ট্রেসব্যাক সংরক্ষিত আছে। মনে রাখবেন এটি একটি সর্বোত্তম অনুশীলন নয় এবং পাইথন 3 এ এটি অবৈধ সিনট্যাক্স (চারপাশে কাজ করার পক্ষে সামঞ্জস্যপূর্ণ রাখার সামঞ্জস্য রেখে)।

>>> catch_error_modify_message()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in catch_error_modify_message
  File "<stdin>", line 2, in error
ValueError: oops! <modification>

পাইথন 3 :

    raise error.with_traceback(sys.exc_info()[2])

আবার: Tracebacks manipulating ম্যানুয়ালি এড়াতে। এটা কম কার্যকর এবং আরো ত্রুটি প্রবণ। এবং যদি আপনি থ্রেডিং এবং sys.exc_info ব্যবহার করছেন তবে sys.exc_info ভুল ট্রেসব্যাকটি পেতে পারেন (বিশেষত যদি আপনি নিয়ন্ত্রণ প্রবাহের ব্যতিক্রম হ্যান্ডলিং ব্যবহার করছেন - যা আমি ব্যক্তিগতভাবে এড়িয়ে চলতে চাই।)

পাইথন 3, ব্যতিক্রম চেইন

পাইথন 3 এ, আপনি চেন ব্যতিক্রমগুলি সংরক্ষণ করতে পারেন, যা ট্রেসব্যাকগুলি সংরক্ষণ করে:

    raise RuntimeError('specific message') from error

সচেতন থাকা:

  • এই উত্থাপিত ত্রুটি টাইপ পরিবর্তন, এবং অনুমতি দেয়
  • এটি পাইথন 2 এর সাথে সামঞ্জস্যপূর্ণ নয়

প্রত্যাখ্যান পদ্ধতি:

এই সহজে লুকাতে এবং এমনকি উত্পাদন কোড পেতে পারেন। আপনি একটি ব্যতিক্রম বাড়াতে চান, এবং তাদের করছেন একটি ব্যতিক্রম বাড়াতে হবে, কিন্তু উদ্দেশ্যে না!

পাইথন 2 তে বৈধ, কিন্তু পাইথন 3 তে নিম্নলিখিতগুলি হল না:

raise ValueError, 'message' # Don't do this, it's deprecated!

পাইথন (2.4 এবং নিম্ন) এর পুরোনো সংস্করণগুলিতে শুধুমাত্র বৈধ , আপনি এখনও লোকেদের স্ট্রিংগুলি উত্থাপন করতে পারেন:

raise 'message' # really really wrong. don't do this.

সমস্ত আধুনিক সংস্করণে, এটি আসলে একটি টাইপ ইরেকর বাড়াবে কারণ আপনি একটি বেস এক্সক্সেশন টাইপ উত্থাপন করছেন না। আপনি যদি সঠিক ব্যতিক্রমটি পরীক্ষা করে না থাকেন এবং সমস্যাটির বিষয়ে সচেতন না হন তবে এটির উৎপাদন হতে পারে।

উদাহরণ ব্যবহার

আমি যদি এটি ভুলভাবে ব্যবহার করি তবে আমার API এর গ্রাহকদের সতর্ক করার জন্য ব্যতিক্রমগুলি উত্থাপন করি:

def api_func(foo):
    '''foo should be either 'baz' or 'bar'. returns something very useful.'''
    if foo not in _ALLOWED_ARGS:
        raise ValueError('{foo} wrong, use "baz" or "bar"'.format(foo=repr(foo)))

Apropos যখন আপনার নিজের ত্রুটি ধরনের তৈরি করুন

"আমি উদ্দেশ্য উপর একটি ত্রুটি করতে চাই, যাতে এটা ছাড়া অন্যথায় যেতে হবে"

আপনি আপনার নিজস্ব ত্রুটি ধরনের তৈরি করতে পারেন, যদি আপনি আপনার অ্যাপ্লিকেশনের সাথে কোনও নির্দিষ্ট ভুলটি ইঙ্গিত করতে চান তবে কেবল ব্যতিক্রম অনুক্রমের যথাযথ বিন্দুটি উপবিষ্ট করুন:

class MyAppLookupError(LookupError):
    '''raise this when there's a lookup error for my app'''

এবং ব্যবহার:

if important_key not in resource_dict and not ok_to_be_missing:
    raise MyAppLookupError('resource is missing, and that is not ok.')

এটা করবেন না । একটি বেয়ার Exception উত্থাপন একেবারে সঠিক জিনিস না; পরিবর্তে share ।

এর চেয়ে অনেক বেশি পাইথনিক পাওয়া যাবে না:

raise Exception("I know python!")

আপনি আরো তথ্য চান তাহলে পাইথন জন্য বাড়া বিবৃতি ডক্স দেখুন।


সাধারণ ক্ষেত্রে যেখানে আপনাকে কিছু অপ্রত্যাশিত অবস্থার প্রতিক্রিয়ায় ব্যতিক্রমটি নিক্ষেপ করতে হবে এবং আপনি যে ধরতে চান না, তবে এটি যদি কখনও ঘটতে পারে তা থেকে ডিবাগ করতে সক্ষম হবার জন্য দ্রুত ব্যর্থ হতে পারে - সবচেয়ে লজিক্যাল মনে হচ্ছে AssertionError :

if 0 < distance <= RADIUS:
    #Do something.
elif RADIUS < distance:
    #Do something.
else:
    raise AssertionError("Unexpected value of 'distance'!", distance)

প্রথম বিদ্যমান উত্তর পড়ুন, এই মাত্র একটি সংযোজন।

আপনি যুক্তি সঙ্গে বা ছাড়া ব্যতিক্রম বাড়াতে পারেন লক্ষ্য করুন।

উদাহরণ:

raise SystemExit

প্রোগ্রামটি বন্ধ করে দেয় তবে আপনি কী জানতে চান জানতে চান। সুতরাং আপনি এটি ব্যবহার করতে পারেন।

raise SystemExit("program exited")

এই প্রোগ্রাম বন্ধ করার আগে stderr থেকে "প্রোগ্রাম exited" মুদ্রণ করা হবে।





exception-handling