এর মধ্যে কি ব্যতিক্রম বাড়াতে খারাপ ফর্ম হিসাবে বিবেচনা করা হয় __init__
? যদি তা হয়, তবে নির্দিষ্ট শ্রেণীর ভেরিয়েবলগুলি None
ভুল টাইপের হিসাবে আরম্ভ করা হলে ত্রুটি নিক্ষেপের গ্রহণযোগ্য পদ্ধতি কী ?
এর মধ্যে কি ব্যতিক্রম বাড়াতে খারাপ ফর্ম হিসাবে বিবেচনা করা হয় __init__
? যদি তা হয়, তবে নির্দিষ্ট শ্রেণীর ভেরিয়েবলগুলি None
ভুল টাইপের হিসাবে আরম্ভ করা হলে ত্রুটি নিক্ষেপের গ্রহণযোগ্য পদ্ধতি কী ?
উত্তর:
ভিতরে ব্যতিক্রম উত্থাপন __init__()
একেবারে ঠিক আছে। কোনও কনস্ট্রাক্টরের মধ্যে ত্রুটির শর্তটি নির্দেশ করার মতো অন্য কোনও ভাল উপায় নেই এবং স্ট্যান্ডার্ড লাইব্রেরিতে এমন অনেক শত উদাহরণ রয়েছে যেখানে কোনও বস্তু তৈরি করা ব্যতিক্রম বাড়াতে পারে।
উত্থাপিত ত্রুটি শ্রেণি অবশ্যই আপনার উপর নির্ভর করে। ValueError
সবচেয়ে ভাল যদি কনস্ট্রাক্টর একটি অবৈধ প্যারামিটার পাস করে।
ValueError
এবং TypeError
।
__init__
এটি নির্মাণকারী নয়, এটি অন্তর্নিদীকরণকারী। আপনি লাইনটি সম্পাদনা করতে চাইতে পারেন কোনও কনস্ট্রাক্টরের মধ্যে ত্রুটি শর্তটি বোঝানোর জন্য আর কোনও ভাল উপায় নেই, ..
এটি সত্য যে কোনও নির্মাণকারীর মধ্যে ত্রুটি চিহ্নিত করার একমাত্র সঠিক উপায় ব্যতিক্রম বাড়িয়ে তুলছে। এ কারণেই সি ++ এবং অন্যান্য অবজেক্ট-ভিত্তিক ভাষাগুলিতে যেগুলি ব্যতিক্রমী সুরক্ষার কথা মাথায় রেখে তৈরি করা হয়েছে, কোনও বস্তুর নির্মাতাকে কোনও ব্যতিক্রম নিক্ষেপ করা হলে তাকে ধ্বংসকারী বলা হয় না (অর্থাত্ বস্তুর সূচনাটি অসম্পূর্ণ)। পাইথনের মতো স্ক্রিপ্টিং ভাষার ক্ষেত্রে এটি প্রায়শই হয় না। উদাহরণস্বরূপ, সকেট কোড-কানেক্ট () ব্যর্থ হলে নিম্নলিখিত কোডটি একটি অ্যাট্রিবিউটআর্র ফেলে দেয়:
class NetworkInterface:
def __init__(self, address)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect(address)
self.stream = self.socket.makefile()
def __del__(self)
self.stream.close()
self.socket.close()
কারণটি হ'ল স্ট্রিম বৈশিষ্ট্যটি আরম্ভ করার আগে সংযোগ প্রচেষ্টা ব্যর্থ হওয়ার পরে অসম্পূর্ণ অবজেক্টের ডেস্ট্রাক্টরকে ডাকা হয়। আপনি নির্মাণকারীদের থেকে ব্যতিক্রম ছোঁড়া এড়ানো উচিত নয়, আমি কেবল বলছি যে পাইথনে সম্পূর্ণ ব্যতিক্রমী নিরাপদ কোডটি লেখা শক্ত। কিছু পাইথন বিকাশকারী পুরোপুরি ডেস্ট্রাক্টর ব্যবহার করা এড়ায় না, তবে এটি অন্য বিতর্কের বিষয়।
__del__
কারণ এটি খারাপভাবে লেখা হয়েছে। আপনি যদি this->p_socket->close()
সি +++ তে কোনও ডেস্ট্রাক্টর করে থাকেন তবে আপনার ঠিক একই সমস্যা হবে । সি ++ এ আপনি তা করবেন না - আপনি সদস্যটির বিষয়টিকে নিজেরাই ধ্বংস করতে দেবেন। অজগর একই কাজ।
এটির কোনও খারাপ কারণ হওয়া উচিত বলে আমি কোনও কারণ দেখছি না।
বিপরীতে, ব্যতিক্রমগুলির একটির ভাল কাজ করার জন্য পরিচিত, ত্রুটি কোডগুলি ফিরিয়ে দেওয়ার বিরোধিতা হিসাবে, ত্রুটি কোডগুলি সাধারণত কনস্ট্রাক্টর দ্বারা ফেরত দেওয়া যায় না । কমপক্ষে সি ++ এর মতো ভাষায়, ব্যতিক্রমগুলি উত্থাপনই ত্রুটিগুলি চিহ্নিত করার একমাত্র উপায়।
আমি উপরোক্ত সকলের সাথে একমত
ব্যতিক্রম উত্থাপন ব্যতীত অন্য কোনও বস্তুর সূচনাতে কিছু ভুল হয়েছে বলে সিগন্যাল করার সত্যিই অন্য উপায় নেই।
বেশিরভাগ প্রোগ্রামের ক্লাসগুলিতে যেখানে শ্রেণীর রাজ্য সম্পূর্ণরূপে সেই শ্রেণীর ইনপুটগুলির উপর নির্ভরশীল হয় আমরা আশা করতে পারি যে কোনও ধরণের ভ্যালুয়েরর বা টাইপআরারের উত্থাপিত হবে।
পার্শ্ব-প্রতিক্রিয়াযুক্ত ক্লাসগুলি (যেমন একটি যা নেটওয়ার্কিং বা গ্রাফিক্স করে) থাই-তে একটি ত্রুটি বাড়িয়ে তুলতে পারে (উদাহরণস্বরূপ) যদি নেটওয়ার্ক ডিভাইসটি অনুপলব্ধ থাকে বা ক্যানভাস অবজেক্টে লিখিত না যায়। এটি আমার কাছে বোধগম্য বলে মনে হয় কারণ প্রায়শই আপনি ব্যর্থতার পরিস্থিতি যত তাড়াতাড়ি সম্ভব জানতে চান।