পাইথনে আমার কখন ব্যতিক্রম সাবক্লাস করা উচিত?


10

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

কোড পর্যালোচনা চলাকালীন আমার সিনিয়র ইঞ্জিনিয়ার, যাকে আমি অনেক মূল্যবান বলেছি, আমার এই ব্যতিক্রমগুলি সাবক্লাস করা উচিত। তার যুক্তি হ'ল ভবিষ্যতে আমরা ব্যতিক্রমগুলি অন্যরকমভাবে পরিচালনা করতে চাই এবং এটি আরও সহজ হবে।

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

আমি প্রতিটি মামলার জন্য কোনও যুক্তি শুনতে চাই।


2
ইয়াগনি ... আপনার এখনই এটি দরকার নেই এবং আপনি খুব বেশি অসুবিধা না করে সর্বদা এটি পরে যুক্ত করতে পারেন।
রবার্ট হার্ভে

আপনার কোন উদাহরণ আছে? আপনি কি কেবল Exceptionউদাহরণস্বরূপ, বা আরও নির্দিষ্ট বিল্ট-ইন ত্রুটিগুলি উত্থাপন করছেন ?
jonrsharpe

কেবলমাত্র একটি ব্যতিক্রম উত্থাপন ("নির্দিষ্ট বিবরণ")
এজরা

কমপক্ষে ইজরা, আপনার দেখতে হবে যে আরও বিলম্বিত অন্তর্নিহিত ব্যতিক্রম আছে কিনা ( ডকস.পাইথন.আর . / 2 / লিবারি / এক্সেপশনস html দেখুন )।
jonrsharpe

উত্তর:


8

তুমি ঠিক বলছো

আপনার পক্ষের পক্ষে যুক্তিটি ইতিমধ্যে রবার্ট হার্ভে উল্লেখ করেছেন: আপনার এই মুহুর্তে কোডের দরকার নেই, বিশেষত যেহেতু পরে এটি যুক্ত করা সহজ।

আপনার পর্যালোচকও ঠিক

অন্যদিকে, পর্যালোচকটির বক্তব্যটিও বোধগম্য:

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

    নোট করুন যে এখনই কাস্টম ব্যতিক্রম যুক্ত করা খুব কঠিন নয় :

    class MyCustomException(Exception):
        pass
    

    আপনার যা দরকার তা হল। এটি কেবলমাত্র দুটি লাইনের কোড (যদি আপনি একটি ফাইলে কাস্টম ব্যতিক্রম রাখেন তবে আপনাকে আলাদা ফাইল তৈরি করার প্রয়োজনও নাও হতে পারে)।

  • কোডটি নিজেই আরও ভাল, আরও পাঠযোগ্য looks

    if price < self.PriceMinValue:
        raise OutOfRangeException("The price is inferior to zero.")
    

    তুলনায় কিছুটা বেশি পঠনযোগ্য বলে মনে হচ্ছে:

    if price < self.PriceMinValue:
        raise Exception("The price is inferior to zero.")
    

    কারণ ব্যতিক্রমের ইঙ্গিতটি:

    • কোডের দ্বিতীয় খণ্ডে, আমাকে বিবরণটি পড়তে হবে এবং অনুমান করতে হবে যে দামটি সীমা ছাড়িয়েছে (বা সম্ভবত এটি নয়? সম্ভবত এমন কিছু মামলা রয়েছে যেখানে মূল্য নেতিবাচক হতে পারে, যেমন ছাড়ের মতো?)

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

তাই?

তাই:

  • উভয় পন্থা বৈধ। আপনার পছন্দসই ধরণের প্রয়োজন না হলে আপনি যদি ব্যতিক্রমগুলি সাবক্লাস না করেন তবে আপনি ঠিক বলেছেন। আপনি যখন সাবক্লাসটি ব্যতিক্রমগুলি করেন কারণ এটি করার জন্য কোনও ব্যয় হয় না এবং এটি পরে কার্যকর হতে পারে, আপনি ঠিক বলেছেন।

  • আপনার দলের সাথে সামঞ্জস্য বজায় রাখুন। যদি আপনার দল কাস্টম ব্যতিক্রমগুলি ব্যাপকভাবে ব্যবহার করে তবে সেগুলি ব্যবহার করুন।


2
কিন্তু একটি সুখী মাঝারি হল: raise ValueError('The price is less than zero')। এটি বেসের চেয়ে বেশি নির্দিষ্ট Exception, তবে কোনও গোলমাল ছাড়াই।
jonrsharpe

আপনার কাছে যদি একটি দল থাকে তবে সরল বক্তব্য "ধারাবাহিক হোন" এর জন্য, আপনার সাথে না থাকলে +1 করুন।
Styne666
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.