কেন "ব্যতীত: পাস" একটি খারাপ প্রোগ্রামিং অনুশীলন?


324

আমি কীভাবে ব্যবহারকে except: passনিরুৎসাহিত করা হয় তা সম্পর্কে প্রায়শই অন্যান্য স্ট্যাক ওভারফ্লো প্রশ্নগুলিতে মন্তব্যগুলি দেখি । কেন এই খারাপ? কখনও কখনও আমি ত্রুটিগুলি কী তা কী যত্ন নেই এবং আমি কেবল কোডটি দিয়ে চালিয়ে যেতে চাই।

try:
    something
except:
    pass

except: passব্লক ব্যবহার খারাপ কেন ? কী খারাপ করে? এটি কি আমি passযে exceptকোনও ত্রুটিতে রয়েছি বা আমার কোনও ত্রুটি রয়েছে তা কি?


1
এটি খুব কমপক্ষে, আমি আপনাকে এটি লগ করার পরামর্শ দিচ্ছি, যাতে আপনি কী সমস্যাগুলি উপেক্ষা করছেন তা জানেন। loggingতাদের উত্পাদনে প্রবাহিত স্ট্রিমিং এড়াতে DEBUG পর্যায়ে মডিউলটি ব্যবহার করুন , তবে তাদের বিকাশে উপলব্ধ রাখুন।
pcurry

উত্তর:


345

আকর্ষণীয়: আপনি সঠিকভাবে অনুমিত হিসাবে, সেখানে এটি দুটি পক্ষই কোন পর এর ব্যতিক্রম টাইপ নির্দিষ্ট করে ত্রুটি exceptএবং নিছক কোন পদক্ষেপ গ্রহণ ছাড়াই এটি ক্ষণস্থায়ী।

আমার ব্যাখ্যাটি "কিছুটা" দীর্ঘ — তাই tl; ডাঃ এটির সাথে এটি ভেঙে যায়:

  1. কোনও ত্রুটি ধরবেন না । আপনি যে ব্যতিক্রমগুলি থেকে পুনরুদ্ধার করতে প্রস্তুত এবং কেবল সেগুলি ধরতে প্রস্তুত তা সর্বদা নির্দিষ্ট করুন।
  2. ব্লক ব্যতীত পাস এড়ানো চেষ্টা করুন । সুস্পষ্টভাবে কাঙ্ক্ষিত না হলে এটি সাধারণত কোনও ভাল লক্ষণ নয়।

তবে আসুন বিশদে যাওয়া যাক:

কোনও ত্রুটি ধরবেন না

কোনও tryব্লক ব্যবহার করার সময় , আপনি সাধারণত এটি করেন কারণ আপনি জানেন যে ব্যতিক্রম ছোঁড়ার সম্ভাবনা রয়েছে। এই হিসাবে, আপনার ইতিমধ্যে কী ভাঙতে পারে এবং কোন ব্যতিক্রম নিক্ষেপ করা যেতে পারে তার একটি আনুমানিক ধারণা রয়েছে । এই ধরনের ক্ষেত্রে, আপনি একটি ব্যতিক্রম ধরা কারণ আপনি ইতিবাচকভাবে এটি থেকে পুনরুদ্ধার করতে পারেন । তার মানে আপনি ব্যতিক্রমের জন্য প্রস্তুত এবং কিছু বিকল্প পরিকল্পনা রয়েছে যা আপনি সেই ব্যতিক্রমের ক্ষেত্রে অনুসরণ করবেন।

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

তবে, যদি আমরা সমস্ত কিছু ধরতে পারি তবে — ব্যতিক্রমগুলি থেকে আমরা পুনরুদ্ধার করতে প্রস্তুত addition এছাড়াও এমন একটি সম্ভাবনাও রয়েছে যা আমরা প্রত্যাশা করি নি এবং আমরা প্রকৃতপক্ষে পুনরুদ্ধার করতে পারি না; বা পুনরুদ্ধার করা উচিত নয়।

উপরের থেকে কনফিগারেশন ফাইলের উদাহরণটি নেওয়া যাক। অনুপস্থিত ফাইলের ক্ষেত্রে, আমরা সবেমাত্র আমাদের ডিফল্ট কনফিগারেশন প্রয়োগ করেছি এবং পরবর্তী সময়ে স্বয়ংক্রিয়ভাবে কনফিগারেশনটি সংরক্ষণ করার সিদ্ধান্ত নিয়েছি (সুতরাং পরবর্তী সময় ফাইলটি উপস্থিত থাকবে)। এখন কল্পনা করুন আমরা একটি IsADirectoryError, বা একটি পেয়েছিPermissionErrorপরিবর্তে. এই ধরনের ক্ষেত্রে, আমরা সম্ভবত চালিয়ে যেতে চাই না; আমরা এখনও আমাদের ডিফল্ট কনফিগারেশন প্রয়োগ করতে পারি, তবে আমরা পরে ফাইলটি সংরক্ষণ করতে পারব না। এবং সম্ভবত এটি ব্যবহারকারীর একটি কাস্টম কনফিগারেশনও বোঝানো হয়েছে, তাই ডিফল্ট মানগুলি ব্যবহার করা সম্ভবত পছন্দসই নয়। সুতরাং আমরা অবিলম্বে এটি সম্পর্কে ব্যবহারকারীকে বলতে চাই এবং সম্ভবত প্রোগ্রামের প্রয়োগও বাতিল করে দিতে পারি। তবে এটি এমন কিছু নয় যা আমরা কিছু ছোট কোডের অভ্যন্তরে গভীরভাবে করতে চাই; এটি অ্যাপ্লিকেশন-স্তরের গুরুত্বের কিছু, তাই এটি শীর্ষে পরিচালনা করা উচিত - সুতরাং ব্যতিক্রমটি বুদবুদ হয়ে উঠুক।

পাইথন 2 আইডিয়াম নথিতে আরও একটি সহজ উদাহরণ উল্লেখ করা হয়েছে । এখানে কোডে একটি সাধারণ টাইপ রয়েছে যা এটি ভেঙে দেয়। যেহেতু আমরা প্রতিটি ব্যতিক্রম ধরছি , আমরা NameErrorএস এবং SyntaxErrorএসও ধরছি । উভয়ই ভুলত্রুটি যা প্রোগ্রামিংয়ের সময় আমাদের সকলের হয়; এবং উভয়ই ভুল যা আমরা কোড শিপিংয়ের সময় একেবারে অন্তর্ভুক্ত করতে চাই না। তবে আমরা সেগুলিও ধরা পড়েছি, আমরা এমনকি তাদের জানব না যে সেগুলি সেখানে ঘটেছে এবং সঠিকভাবে এটি ডিবাগ করার জন্য কোনও সহায়তা হারাবে না।

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

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

ব্লক ব্যতীত পাস এড়ানো চেষ্টা করুন

স্পষ্টভাবে নির্দিষ্ট ব্যতিক্রমগুলির একটি ছোট নির্বাচনকে ধরার সময়, অনেকগুলি পরিস্থিতি রয়েছে যেখানে আমরা কিছু না করে ঠিক হয়ে যাব। এই ধরনের ক্ষেত্রে, ঠিক থাকা except SomeSpecificException: passঠিক আছে। যদিও বেশিরভাগ সময় এটি হয় না কারণ আমাদের সম্ভবত পুনরুদ্ধার প্রক্রিয়া সম্পর্কিত কিছু কোডের প্রয়োজন (উপরে বর্ণিত হিসাবে)। এটি উদাহরণস্বরূপ এমন কিছু হতে পারে যা আবার ক্রিয়াটি আবার চেষ্টা করে বা এর পরিবর্তে একটি ডিফল্ট মান সেট করে।

যদি তা না হয় তবে উদাহরণস্বরূপ, কারণ আমাদের কোডটি এটি সাফল্য না হওয়া পর্যন্ত পুনরাবৃত্তি করার জন্য ইতিমধ্যে কাঠামোগত তৈরি করা হয়েছে, তবে কেবল পাশ করা যথেষ্ট passing উপরে থেকে আমাদের উদাহরণ গ্রহণ করে, আমরা ব্যবহারকারীকে একটি নম্বর লিখতে বলি। যেহেতু আমরা জানি যে ব্যবহারকারীরা তাদের কাছে যা চান আমরা তা করতে চাই না, আমরা কেবল এটি প্রথমে একটি লুপে রেখে দিতে পারি, যাতে এটি দেখতে দেখতে:

def askForNumber ():
    while True:
        try:
            return int(input('Please enter a number: '))
        except ValueError:
            pass

যেহেতু আমরা চেষ্টা চালিয়ে যাচ্ছি যতক্ষণ না কোনও ব্যতিক্রম ছোঁড়া হয়, তাই ব্লক ব্যতীত আমাদের বিশেষ কিছু করার দরকার নেই, সুতরাং এটি ঠিক আছে। তবে অবশ্যই একটি যুক্তি হতে পারে যে আমরা অন্তত ব্যবহারকারীকে কিছুটা ত্রুটি বার্তা দেখাতে চাই কারণ তাকে কেন ইনপুটটি পুনরাবৃত্তি করতে হবে tell

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

except: pass

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


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


1
"আপনি কমপক্ষে ত্রুটিটি লগ করতে চান এবং অ্যাপ্লিকেশনটি শেষ করতে সম্ভবত পুনরায় এটি প্রয়োগ করতে পারেন"। আপনি কীভাবে একটি ব্যতিক্রমটিকে "পুনরায় তুলতে" পারেন তা ধরার পরেও এটি বুদবুদ হতে থাকে? ব্যতিক্রমটি অ্যাপ্লিকেশনটি ছাড়তে বাধ্য করার সময় কিছু কাস্টম ত্রুটি বার্তাগুলি যুক্ত করা আমার পক্ষে এটি দরকারী বলে মনে হচ্ছে।
গ্যাব্রিয়েল স্ট্যাপলস

1
এটি স্পষ্ট করতে সহায়তা করে: তারা কম্বল ব্যবহার করে except, তবে raiseব্যতিক্রমটি বুদবুদ দেওয়া, অ্যাপ্লিকেশনটি সমাপ্ত করে অবিরত রাখতে কোনও যুক্তি ছাড়াই কল করুন । আমি এটি পছন্দ করি: ianbicking.org/blog/2007/09/re-raising-exception.html । কম্বলটি ব্যবহার না করার বিষয়ে নিয়মের একটি কঠিন ব্যতিক্রম বলে মনে হচ্ছে except
গ্যাব্রিয়েল স্টেপলস

1
হ্যাঁ, গ্যাব্রিয়েল স্ট্যাপলস হ্যাঁ, একটি ধরা ব্যতিক্রম ব্যবহার করে পুনরায় তৈরি করা যেতে পারে raise। ব্যতিক্রম লগ করতে আপনি সাধারণত আপনার অ্যাপ্লিকেশনটির মধ্যে কয়েকটি স্থানে এটি করতেন।
পোকার

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

262

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

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

এজন্য আপনার বিশেষভাবে কেবল কিছু ত্রুটি উপেক্ষা করার মধ্যে নিজেকে সীমাবদ্ধ করা উচিত এবং বাকী অংশটি পাস করতে দিন।


75

আক্ষরিকভাবে আপনার সিউডো কোডটি কার্যকর করা কোনও ত্রুটি দেয় না:

try:
    something
except:
    pass

যেন এটি কোনও ছুঁড়ির পরিবর্তে কোডের একটি পুরোপুরি বৈধ টুকরা NameError। আমি আশা করি এটি আপনি যা চান তা নয়।


51

কেন "ব্যতীত: পাস" একটি খারাপ প্রোগ্রামিং অনুশীলন?

কেন এই খারাপ?

try:
    something
except:
    pass

এটি সহ GeneratorExit, KeyboardInterruptএবং SystemExit- সহ প্রতিটি সম্ভাব্য ব্যতিক্রম ধরা পড়ে যা ব্যতিক্রমগুলি সম্ভবত আপনি ধরতে চান না। এটি ধরার মতোই BaseException

try:
    something
except BaseException:
    pass

ডকুমেন্টেশনের পুরানো সংস্করণগুলি বলে :

যেহেতু পাইথনের প্রতিটি ত্রুটি একটি ব্যতিক্রম উত্থাপন করে, except:তাই অনেক প্রোগ্রামিং ত্রুটি রানটাইম সমস্যার মতো দেখায়, যা ডিবাগিং প্রক্রিয়াটিকে বাধা দেয়।

পাইথন ব্যতিক্রম হায়ারার্কি

আপনি যদি পিতামাতার ব্যতিক্রমী ক্লাসটি ধরেন তবে আপনি তাদের সমস্ত শিশু ক্লাসও ধরেন। আপনি হ্যান্ডেল করার জন্য প্রস্তুত ব্যতিক্রমগুলি কেবল এটি ধরা আরও বেশি মার্জিত।

এখানে পাইথন 3 ব্যতিক্রম শ্রেণিবিন্যাস - আপনি কি সত্যিই তাদের সব ধরতে চান ?:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
           +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning

এটি করবেন না

আপনি যদি ব্যতিক্রম হ্যান্ডলিংয়ের এই ফর্মটি ব্যবহার করেন:

try:
    something
except: # don't just do a bare except!
    pass

তারপরে আপনি আপনার somethingব্লকটি সিটিআরএল-সি দিয়ে বাধা দিতে পারবেন না । আপনার প্রোগ্রামটি ভিতরে থাকা প্রতিটি সম্ভাব্য বিষয়টিকে উপেক্ষা করবেtry কোড ব্লকের ।

এখানে আরও একটি উদাহরণ যা একই অনাকাঙ্ক্ষিত আচরণ করবে:

except BaseException as e: # don't do this either - same as bare!
    logging.info(e)

পরিবর্তে, আপনি যে নির্দিষ্ট ব্যতিক্রমটি সন্ধান করছেন তা কেবল ধরার চেষ্টা করুন। উদাহরণস্বরূপ, যদি আপনি জানেন তবে আপনি কোনও রূপান্তরটিতে একটি মান-ত্রুটি পেতে পারেন:

try:
    foo = operation_that_includes_int(foo)
except ValueError as e:
    if fatal_condition(): # You can raise the exception if it's bad,
        logging.info(e)   # but if it's fatal every time,
        raise             # you probably should just not catch it.
    else:                 # Only catch exceptions you are prepared to handle.
        foo = 0           # Here we simply assign foo to 0 and continue. 

আরও একটি উদাহরণ সঙ্গে আরও ব্যাখ্যা

আপনি সম্ভবত এটি করছেন কারণ আপনি ওয়েব-স্ক্র্যাপিং করছেন এবং বলছেন, এ UnicodeError, তবে আপনি ব্যতিক্রমী ব্যতিক্রমী ধরাটি ব্যবহার করেছেন বলে আপনার কোড, যার অন্যান্য মৌলিক ত্রুটি থাকতে পারে, ব্যান্ডউইথ নষ্ট করার চেষ্টা করবে , প্রক্রিয়াকরণের সময়, আপনার সরঞ্জাম পরিধান এবং টিয়ার, স্মৃতিশক্তি শেষ হয়ে যাওয়া, আবর্জনার ডেটা সংগ্রহ করা ইত্যাদি

যদি অন্য লোকেরা আপনাকে সম্পূর্ণ করতে বলে যাতে তারা আপনার কোডের উপর নির্ভর করতে পারে তবে আমি বুঝতে পারি যে কেবল সবকিছু হ্যান্ডেল করতে বাধ্য feeling তবে আপনি যদি আপনার বিকাশের সাথে সাথে শোরগোল ব্যর্থ করতে ইচ্ছুক হন তবে আপনার সমস্যাগুলি সংশোধন করার সুযোগ থাকবে যা কেবল মাঝে মধ্যেই পপ আপ হতে পারে, তবে এটি দীর্ঘমেয়াদি ব্যয়বহুল বাগ হতে পারে।

আরও সঠিক ত্রুটি পরিচালনার সাথে আপনার কোডটি আরও শক্তিশালী হতে পারে।


31
>>> import this

টিম পিটার্স দ্বারা নির্মিত পাইথনের জেন

কদর্য চেয়ে সুন্দর।
সুস্পষ্ট বর্ণিত চেয়ে ভাল।
সহজ জটিল চেয়ে ভাল।
জটিল জটিল চেয়ে ভাল।
নেস্টেড থেকে ফ্ল্যাট ভাল।
গা Sp়ের চেয়ে বিরাগই ভাল।
পঠনযোগ্যতা গণনা।
বিশেষ কেসগুলি নিয়ম ভাঙার পক্ষে যথেষ্ট বিশেষ নয়।
যদিও ব্যবহারিকতা বিশুদ্ধতা বীট।
ত্রুটিগুলি কখনই নিঃশব্দে কাটানো উচিত নয়।
স্পষ্টভাবে নিরব না হলে।
অস্পষ্টতার মুখে অনুমান করার প্রলোভনটি অস্বীকার করুন।
এটির জন্য একটি - এবং অগ্রাধিকার কেবল একটিই - প্রকাশ্য উপায় থাকতে হবে।
যদিও আপনি ডাচ না হলে এই উপায়টি প্রথমে স্পষ্ট নাও হতে পারে।
এখন আগের চেয়ে ভাল is
যদিও কখনও কখনও এর চেয়ে ভাল হয় নাঠিক এখন।
যদি বাস্তবায়নটি ব্যাখ্যা করা শক্ত হয় তবে এটি একটি খারাপ ধারণা।
বাস্তবায়নটি যদি ব্যাখ্যা করা সহজ হয় তবে এটি একটি ভাল ধারণা হতে পারে।
নেমস্পেসগুলি হ'ল একটি দুর্দান্ত ধারণা - আসুন আমরা তাদের আরও কিছু করি!

সুতরাং, এখানে আমার মতামত। যখনই আপনি কোনও ত্রুটি খুঁজে পান, আপনার এটি পরিচালনা করার জন্য কিছু করা উচিত, যেমন এটি লগফাইলে বা অন্য কোনও কিছুতে লিখুন। কমপক্ষে, এটি আপনাকে জানায় যে কোনও ত্রুটি ছিল।


64
-1 কর্তৃপক্ষের পক্ষ থেকে যুক্তি আসলে কিছুই ব্যাখ্যা করে না । কর্তৃপক্ষ ভুল হতে পারে।
ইজকাটা

23
@ ইজকাটা যা লিখেছিল, এবং এর নীচে এক লাইন, একই কর্তৃপক্ষ লিখেছেন: "সুস্পষ্টভাবে চুপচাপ না করা", যা পাস ব্যতীত ঠিক তা-ই নয়।
অফরি রবিভ

13
@OfriRaviv না, ত্রুটি সুস্পষ্টভাবে পাস হচ্ছে না ? স্পষ্টতই ত্রুটির নামকরণের প্রয়োজন হবে যা নিঃশব্দরূপে পাস করা উচিত, যা এটি সম্পর্কে স্পষ্ট হওয়া । এটি ব্যতীত যা হয় না: পাস করে।
চলোনিয়ান

24

আপনার except Exception:মতো SystemExitবা কমপ্লেক্স সিস্টেম ব্যতিক্রম ধরা এড়াতে কমপক্ষে ব্যবহার করা উচিত KeyboardInterrupt। এখানে ডক্সের লিঙ্ক

অবাঞ্ছিত ব্যতিক্রমগুলি ধরা এড়াতে সাধারণভাবে আপনি স্পষ্টভাবে ব্যতিক্রমগুলি ধরতে চান যা আপনি ধরতে চান ine আপনি কী ব্যতিক্রম উপেক্ষা করবেন তা আপনার জানা উচিত ।


13

প্রথমত, এটি পাইথনের জেনের দুটি নীতি লঙ্ঘন করে :

  • সুস্পষ্ট বর্ণিত চেয়ে ভাল
  • ত্রুটিগুলি কখনই নিঃশব্দে কাটানো উচিত নয়

এর অর্থ কী, আপনি ইচ্ছাকৃতভাবে নিজের ত্রুটিটি নিঃশব্দে পাস করেছেন। তদতিরিক্ত, আপনি ইভেন্টটি জানেন না, কোন ত্রুটিটি ঠিক ঘটেছে, কারণ except: passকোনও ব্যতিক্রম ধরা পড়বে।

দ্বিতীয়ত, আমরা যদি পাইথনের জেন থেকে বিমূর্ত হয়ে দূরে থাকার চেষ্টা করি এবং ন্যায়বিচারের সাথে কথা বলি তবে আপনার জানা উচিত, এটি except:passআপনাকে ব্যবহার করে আপনার সিস্টেমে কোনও জ্ঞান এবং নিয়ন্ত্রণ রাখে না। থাম্বের বিধিটি হ'ল ত্রুটি দেখা দিলে একটি ব্যতিক্রম উত্থাপন করা এবং যথাযথ পদক্ষেপ নেওয়া। আপনি যদি আগে থেকে জানেন না, এগুলি কী কী হওয়া উচিত, কমপক্ষে কোথাও ত্রুটিটি লগ করুন (এবং ভালভাবে ব্যতিক্রমটি পুনরায় উত্থাপন করুন):

try:
    something
except:
    logger.exception('Something happened')

তবে, সাধারণত, আপনি যদি কোনও ব্যতিক্রম ধরার চেষ্টা করেন তবে আপনি সম্ভবত কিছু ভুল করছেন!


2
... যদি না স্পষ্টভাবে চুপ করে থাকে, যা ওপি-র ক্ষেত্রে।
হাইপারবোরাস

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

2
@ হাইপারবোরাস, আমি মনে করি না যে সমস্ত এবং যে কোনও ত্রুটি ধরা স্পষ্টভাবে তাদেরকে নিঃশব্দ করে দিচ্ছে, অর্থাৎ আপনি জানেন না যে আপনি কী ধরেন।
আলেকজান্ডার ঝুকভ

13
"কারণ কিছু লোক এরকম বলে" আসলে "কেন?" এর উত্তর নয়? প্রশ্ন।
সেবাস্তিয়ান নেগ্রাসজাস

12

except:passকনস্ট্রাক্ট মূলত যেকোন এবং সমস্ত ব্যতিক্রমী অবস্থার যে আসা পর্যন্ত সময় কোড মধ্যে আবৃত নীরব try:ব্লক চালানো হচ্ছে।

এই খারাপ অভ্যাসটি যা তোলে তা হ'ল এটি যা আপনি আসলে চান তা সাধারণত হয় না। প্রায়শই, কিছু নির্দিষ্ট শর্ত আসে যা আপনি নিঃশব্দ করতে চান এবং except:passএটি একটি অনর্থক যন্ত্র much এটি কাজটি সম্পন্ন করবে, তবে এটি অন্যান্য ত্রুটি শর্তগুলিও মুখোশ করবে যা আপনি সম্ভবত অনুমান করেননি, তবে অন্য কোনও উপায়ে খুব ভালভাবে মোকাবেলা করতে চাইতে পারেন।

পাইথনে যা বিশেষত এটি গুরুত্বপূর্ণ করে তোলে তা হ'ল এই ভাষার প্রতিমাগুলির দ্বারা, ব্যতিক্রমগুলি ত্রুটিযুক্ত হওয়া উচিত নয় । এগুলি প্রায়শই এইভাবে ব্যবহৃত হয়, অবশ্যই বেশিরভাগ ভাষায়। তবে বিশেষত পাইথন মাঝেমধ্যে এগুলিকে কিছু কোড টাস্ক থেকে বিকল্প প্রস্থান পথ বাস্তবায়নের জন্য ব্যবহার করে যা সত্যিকার অর্থে চলমান কেসের অংশ নয়, তবে এটি সময়ে সময়ে জানা যায় এবং বেশিরভাগ ক্ষেত্রে এটি প্রত্যাশিতও হতে পারে। SystemExitপুরানো উদাহরণ হিসাবে ইতিমধ্যে উল্লেখ করা হয়েছে, তবে আজকাল সবচেয়ে সাধারণ উদাহরণ হতে পারে StopIteration। ব্যতিক্রমগুলি এভাবে ব্যবহার করার ফলে প্রচুর বিতর্ক হয়েছিল, বিশেষত যখন পুনরায় এবং জেনারেটরগুলি পাইথনের সাথে প্রথম পরিচয় করা হয়েছিল, তবে শেষ পর্যন্ত ধারণাটি غالب হয়েছিল।


12

# 1 কারণ ইতিমধ্যে জানিয়ে দেওয়া হয়েছে - এটি ত্রুটিগুলি লুকিয়ে রাখে যা আপনি প্রত্যাশা করেননি।

(# 2) - এটি অন্যদের পড়া এবং বুঝতে অসুবিধা করে তোলে।আপনি যখন কোনও ফাইল পড়ার চেষ্টা করছেন আপনি যদি ফাইলনটফাউন্ডএক্সেপশন ধরেন, তবে 'ক্যাচ' ব্লকের কার্যকারিতা কী তা অন্য বিকাশকারীদের কাছে এটি স্পষ্ট। আপনি যদি কোনও ব্যতিক্রম নির্দিষ্ট না করে থাকেন, তবে ব্লকটি কী করা উচিত তা বোঝাতে আপনার অতিরিক্ত মন্তব্য প্রয়োজন।

(# 3) - এটি অলস প্রোগ্রামিং দেখায়। আপনি যদি জেনেরিক চেষ্টা / ধরা ব্যবহার করেন তবে এটি ইঙ্গিত দেয় যে আপনি আপনার প্রোগ্রামে সম্ভাব্য রান-টাইম ত্রুটিগুলি বুঝতে পারছেন না, বা পাইথনে কী ব্যতিক্রমগুলি সম্ভব তা আপনি জানেন না। একটি নির্দিষ্ট ত্রুটি ধরা ধরা দেয় যে আপনি আপনার প্রোগ্রাম এবং পাইথন নিক্ষেপ করে এমন ত্রুটিগুলির পরিসীমা উভয়ই বুঝতে পেরেছেন। এটি অন্যান্য বিকাশকারীদের এবং কোড-পর্যালোচকদের আপনার কাজের উপর নির্ভর করার সম্ভাবনা বেশি।


12

সুতরাং, এই কোড উত্পাদন করে?

fruits = [ 'apple', 'pear', 'carrot', 'banana' ]

found = False
try:
     for i in range(len(fruit)):
         if fruits[i] == 'apple':
             found = true
except:
     pass

if found:
    print "Found an apple"
else:
    print "No apples in list"

এখন কল্পনা করুন try- exceptব্লকটি একটি জটিল বস্তু শ্রেণিবিন্যাসের কয়েকশ লাইনের কল and প্রোগ্রামটি ভুল হয়ে গেলে আপনি কোথায় সন্ধান শুরু করবেন?


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

11

সাধারণভাবে, আপনি তিনটি বিভাগের একটিতে যে কোনও ত্রুটি / ব্যতিক্রম শ্রেণিবদ্ধ করতে পারেন :

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

  • বোনহেডেড : আপনার নিজের ত্রুটি, সম্ভবত কোনও তদারকি, বাগ বা প্রোগ্রামিং ত্রুটির কারণে। আপনার বাগটি ঠিক করা উচিত। আবার আপনার অবশ্যই অবহেলা করা এবং চালিয়ে যাওয়া উচিত নয়।

  • এক্সোজেনাস : আপনি ব্যতিক্রমী পরিস্থিতিতে এই ত্রুটিগুলি আশা করতে পারেন, যেমন ফাইল পাওয়া যায় নি বা সংযোগ অবসান হয়েছে । আপনার এই ত্রুটিগুলি স্পষ্টভাবে পরিচালনা করা উচিত এবং কেবল এটি।

সমস্ত ক্ষেত্রে except: passকেবল আপনার প্রোগ্রামটি অজানা অবস্থায় ছেড়ে দেবে, যেখানে এটি আরও ক্ষতির কারণ হতে পারে।


6

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

সমস্যাগুলি মোকাবেলা করা দরকার। এটি জীবনে যেমন রয়েছে, প্রোগ্রামিংয়ের ক্ষেত্রে, আপনি যদি সমস্যাগুলি একা ছেড়ে চলে যান এবং সেগুলি উপেক্ষা করার চেষ্টা করেন তবে তারা কেবল নিজেরাই অনেক সময় দূরে চলে না; পরিবর্তে তারা বড় এবং গুণিত পেতে। আপনার উপর কোনও সমস্যা বাড়তে না পারে এবং আবার রাস্তায় নামার জন্য, আপনি হয় 1) এটিকে মুছে ফেলুন এবং পরে জগাখিচুড়ি পরিষ্কার করুন, বা 2) এটি ধারণ করুন এবং পরে জঞ্জাল পরিষ্কার করুন।

কেবল ব্যাতিক্রম এবং ত্রুটি উপেক্ষা করে এগুলিকে ছেড়ে যাওয়া মেমরির ফাঁস, বকেয়া ডাটাবেস সংযোগ, ফাইল অনুমতিতে অকারণে লক ইত্যাদির অভিজ্ঞতা অর্জন করার একটি ভাল উপায় is

বিরল ঘটনাগুলিতে, সমস্যাটি এত ক্ষুদ্র, তুচ্ছ এবং - চেষ্টা করার বাইরে ... ব্লক ধরুন - স্ব-অন্তর্ভুক্ত , যে পরে আর পরিষ্কার হওয়ার দরকার নেই। এই একমাত্র অনুষ্ঠানগুলি যখন এই সেরা অনুশীলনটি অগত্যা প্রয়োগ হয় না। আমার অভিজ্ঞতায়, এর অর্থ হ'ল কোডটি যা কিছু করছে তা মূলত ক্ষুদ্র এবং ত্যাগযোগ্য এবং পুনরায় চেষ্টা করার চেষ্টা বা বিশেষ বার্তাগুলির মতো জটিলতা বা থ্রেডটি ধরে রাখার মতো নয়।

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


6

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

তবে কেবলমাত্র একটি এক্সিকিউশন-ব্লকের জন্য পাস ব্লক ব্যবহার করা বৈধ, কারণ আপনি এখনও ব্যতিক্রমগুলির প্রকারের মধ্যে বিটকে আলাদা করেন, তাই আপনি যদি সমস্ত ব্যতিক্রম-ব্লককে একটিতে রেখে দেন তবে তা খালি নয়:

try:
    #code here
except Error1:
    #exception handle1

except Error2:
    #exception handle2
#and so on

সেভাবে আবার লেখা যেতে পারে:

try:
    #code here
except BaseException as e:
    if isinstance(e, Error1):
        #exception handle1

    elif isinstance(e, Error2):
        #exception handle2

    ...

    else:
        raise

সুতরাং পাস-স্টেটমেন্ট সহ ব্লক ব্যতীত একাধিক কোডের ফলাফলও হতে পারে, যার কাঠামোটি বিশেষ ধরণের ব্যতিক্রমগুলি পরিচালনা করে।


4

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

যা বলা হয়েছিল তার সাথে, কোনও প্রোগ্রামিং অনুশীলনকে পরামিতি হিসাবে গ্রহণ করবেন না। এটা বোকা। সর্বদা ব্যতিক্রম উপেক্ষা অবহেলা করার জন্য সময় এবং স্থান সর্বদা থাকে।

বোকা প্যারামাউন্টের আর একটি উদাহরণ gotoঅপারেটর ব্যবহার । আমি যখন স্কুলে ছিলাম, তখন আমাদের অধ্যাপক আমাদের gotoঅপারেটরকে কেবল এটি উল্লেখ করার জন্য শিখিয়েছিলেন যে আপনি এটি কখনও ব্যবহার করবেন না। আপনাকে বিশ্বাস করে এমন লোকেরা বিশ্বাস করবেন না যে xyz কখনই ব্যবহার করা উচিত নয় এবং এটি কার্যকর হলে কোনও দৃশ্য হতে পারে না। সর্বদা আছে।


1
"গোটো" কেসটি স্টাইলিস্টিক এবং মতের বিষয়, যেখানে "ব্যতীত: পাস" সাধারণত সত্যই ভুল is এটি ধরে নেওয়া হয় যে কেউ যদি উদাহরণস্বরূপ, আপনার প্রক্রিয়াটিকে "কিল-টার্মএম" করতে হয় তবে তা এড়িয়ে যাওয়া উচিত। খুব কমপক্ষে এটি খারাপ আচরণ।
স্কোর_উন্ডারে

1
@ স্কোর_উইন্ডারে এখনও এমন কিছু মামলা রয়েছে যেখানে এটি ব্যবহার করা উপযুক্ত। উদাহরণস্বরূপ, যখন কোনও ফাংশন আপনি কল করছেন তা পরিপূরক, অজানা উত্স / লেখকের, মূল কার্যকারিতা প্রভাবিত করে না, তবে ক্র্যাশ হলে সমস্যা দেখা দিতে পারে। আমি বুঝতে পারি যে আপনি তর্ক করবেন যে এই ধরণের কলগুলি সঠিকভাবে গবেষণা করা উচিত এবং বিশ্লেষণ করা উচিত, তবে বাস্তব জীবনে এটি সর্বদা সম্ভব হয় না।
গ্যালেটগুলি

তবুও, আমি যদি আপনার প্রক্রিয়াটি শেষ করতে চাই, হত্যা -9 একমাত্র নির্ভরযোগ্য বিকল্প হওয়া উচিত নয়।
স্কোর_উন্ডারে

2

প্রোগ্রামিংয়ে ত্রুটিগুলি পরিচালনা করা অত্যন্ত গুরুত্বপূর্ণ। কী ভুল হয়েছে তা আপনাকে ব্যবহারকারীকে দেখাতে হবে। খুব কম ক্ষেত্রেই আপনি ত্রুটিগুলি উপেক্ষা করতে পারেন। এটি খুব খারাপ প্রোগ্রামিং অনুশীলন হয়।


2

যেহেতু এটি এখনও উল্লেখ করা হয়নি, এটি ব্যবহার করার জন্য এটি আরও ভাল স্টাইল contextlib.suppress:

with suppress(FileNotFoundError):
    os.remove('somefile.tmp')

লক্ষ্য করুন যে প্রদত্ত উদাহরণে, প্রোগ্রামের অবস্থাটি একই থাকে, ব্যতিক্রম ঘটে কিনা। এর অর্থ, somefile.tmpসর্বদা অস্তিত্বহীন হয়ে যায়।

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