"আধুনিক পাইথনে কাস্টম ব্যতিক্রমগুলি ঘোষণা করার উপযুক্ত উপায়?"
এটি ঠিক আছে, যদি না আপনার ব্যতিক্রম সত্যিই আরও নির্দিষ্ট ব্যতিক্রমগুলির এক প্রকার:
class MyException(Exception):
pass
বা আরও ভাল (সম্ভবত নিখুঁত), pass
কোনও ডক্ট্রাস্টিং দেওয়ার পরিবর্তে :
class MyException(Exception):
"""Raise for my specific kind of exception"""
সাবক্লাসিং ব্যতিক্রম সাবক্লাস
ডক্স থেকে
Exception
সমস্ত অন্তর্নির্মিত, অ-সিস্টেম-বহির্গমন ব্যতিক্রমগুলি এই শ্রেণি থেকে প্রাপ্ত। সমস্ত ব্যবহারকারী-সংজ্ঞায়িত ব্যতিক্রমগুলিও এই শ্রেণি থেকে নেওয়া উচিত।
এর অর্থ হ'ল যদি আপনার ব্যতিক্রমটি আরও নির্দিষ্ট ব্যতিক্রমগুলির একধরণের হয় তবে জেনেরিকের পরিবর্তে সাবক্লাসটি সেই ব্যতিক্রম Exception
(এবং ফলাফলটি Exception
ডক্সের পরামর্শ অনুযায়ী আপনি এখনও পেতে পারেন )। এছাড়াও, আপনি কমপক্ষে একটি ডাস্ট্রিং সরবরাহ করতে পারেন (এবং pass
কীওয়ার্ডটি ব্যবহার করতে বাধ্য করা হবে না ):
class MyAppValueError(ValueError):
'''Raise when my specific value is wrong'''
আপনি একটি কাস্টম দিয়ে নিজেকে তৈরি বৈশিষ্ট্য সেট করুন __init__
। অবস্থানগত আর্গুমেন্ট হিসাবে ডিক পাস করা এড়িয়ে চলুন, আপনার কোডের ভবিষ্যতের ব্যবহারকারীরা আপনাকে ধন্যবাদ জানাবে। আপনি যদি অবহেলিত বার্তার বৈশিষ্ট্যটি ব্যবহার করেন তবে এটিকে নিজেকে নির্ধারণ করা এড়াতে পারবেন DeprecationWarning
:
class MyAppValueError(ValueError):
'''Raise when a specific subset of values in context of app is wrong'''
def __init__(self, message, foo, *args):
self.message = message # without this you may get DeprecationWarning
# Special attribute you desire with your Error,
# perhaps the value that caused the error?:
self.foo = foo
# allow users initialize misc. arguments as any other builtin Error
super(MyAppValueError, self).__init__(message, foo, *args)
আপনার নিজের লেখার দরকার নেই __str__
বা __repr__
। অন্তর্নির্মিতগুলি খুব সুন্দর, এবং আপনার সমবায় উত্তরাধিকার নিশ্চিত করে যে আপনি এটি ব্যবহার করেছেন।
শীর্ষ উত্তরের সমালোচনা
আমি প্রশ্নটি মিস করেছি, তবে কেন নয়:
class MyException(Exception):
pass
আবার উপরের সমস্যাটি হ'ল এটি ধরার জন্য আপনাকে অবশ্যই এটির নাম রাখতে হবে (অন্য কোথাও তৈরি হলে এটি আমদানি করতে হবে) বা এক্সেসপেশন ধরতে হবে (তবে আপনি সম্ভবত সব ধরণের ব্যতিক্রম পরিচালনা করতে প্রস্তুত নন, এবং আপনার কেবলমাত্র ব্যতিক্রমগুলি ধরা উচিত যা আপনি পরিচালনা করতে প্রস্তুত)। নীচের মতো অনুরূপ সমালোচনা, তবে অতিরিক্ত super
এটির মাধ্যমে আরম্ভ করার উপায় নয় এবং আপনি DeprecationWarning
বার্তাটির বৈশিষ্ট্যে অ্যাক্সেস করলে একটি পাবেন :
সম্পাদনা করুন: কোনও কিছুকে ওভাররাইড করতে (বা অতিরিক্ত আরগগুলি পাস করতে), এটি করুন:
class ValidationError(Exception):
def __init__(self, message, errors):
# Call the base class constructor with the parameters it needs
super(ValidationError, self).__init__(message)
# Now for your custom code...
self.errors = errors
এইভাবে আপনি দ্বিতীয় প্যারামে ত্রুটি বার্তাগুলির ডিকটি পাস করতে পারেন এবং এটিতে eEerferences দিয়ে পরে পেতে পারেন
এটির জন্য ঠিক দুটি যুক্তিও পাস করতে হবে (দিক থেকে বাদে self
) আর কিছু নয়, কমও নয়। এটি একটি আকর্ষণীয় প্রতিবন্ধকতা যা ভবিষ্যতের ব্যবহারকারীরা প্রশংসা করতে পারে না।
সরাসরি হতে - এটি লিসকোভ স্থান পরিবর্তনযোগ্যতা লঙ্ঘন করে ।
আমি উভয় ত্রুটি প্রদর্শন করব:
>>> ValidationError('foo', 'bar', 'baz').message
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
ValidationError('foo', 'bar', 'baz').message
TypeError: __init__() takes exactly 3 arguments (4 given)
>>> ValidationError('foo', 'bar').message
__main__:1: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
'foo'
তুলনা করা:
>>> MyAppValueError('foo', 'FOO', 'bar').message
'foo'