লজিকাল অপারেটর হিসাবে চেষ্টা করুন / ক্যাচ ব্যবহার করার পক্ষে বা বিপক্ষে যুক্তিগুলি [বন্ধ]


36

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

যারা ভাবছেন তাদের ক্ষেত্রে ভাষাটি সি # এবং প্রশ্নের কোডটি প্রায় 30+ লাইনের এবং নির্দিষ্ট ব্যতিক্রমগুলির সন্ধান করছে, এটি সমস্ত ব্যতিক্রম পরিচালনা করছে না।


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

15
@ ফ্রাস্ট্রেটেডডব্লিউথফোর্ডস ডিজাইনার: এটি খারাপ যুক্তি। যাদের বিশ্বাস নেই তারা কী করবে? আমার প্রকৃত প্রশ্ন সম্পর্কে কী যেখানে আমি বিশেষত কারণগুলির জন্য জিজ্ঞাসা করি যেহেতু আমি সত্যিই "কেন" বলতে পারি না কেবল এটি ঠিক যে আমি জানি এটি ভুল।
জেমস পি। রাইট

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

11
আমি আশা করি তারা "অবশেষে" ব্লকটিকে "অন্য" হিসাবে সত্যই ব্যবহার করবে না কারণ "অবশেষে" ব্লকটি সর্বদা পূর্বের কোডের পরে চালানো হয় ব্যতীত কোনও ব্যতিক্রম নির্বিশেষে।
জিম্রিড

2
তারা কোন ভাষা ব্যবহার করছে? ওক্যামল, এটি পুরোপুরি ঠিক আছে যেখানে স্ট্যান্ডার্ড লাইব্রেরি নিয়মিতভাবে ব্যতিক্রম ছুঁড়ে দেয়। ব্যতিক্রম হ্যান্ডলিং সেখানে খুব সস্তা। তবে এটি সিএলআই বা জেভিএম-তে দক্ষ হবে না।
এসকে-যুক্তি

উত্তর:


50

ব্যতিক্রম হ্যান্ডলিং প্রবাহ নিয়ন্ত্রণ পরিচালনা করার জন্য ব্যয়বহুল উপায় হয়ে থাকে (অবশ্যই সি # এবং জাভার জন্য)।

রানটাইম বেশ কিছু কাজ করে যখন কোনও ব্যতিক্রমী অবজেক্ট তৈরি হয় - স্ট্যাক ট্রেস একসাথে পাওয়া, ব্যতিক্রমটি কোথায় পরিচালনা করা হয় তা আরও নির্ধারণ করে।

মেমরি এবং সিপিইউ রিসোর্সে এই সমস্ত ব্যয় প্রবাহ নিয়ন্ত্রণের জন্য প্রবাহ নিয়ন্ত্রণ বিবৃতি ব্যবহার করা হলে প্রসারিত করার দরকার নেই।

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

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


1
কর্মক্ষমতা সম্পর্কে একটি ভাল পয়েন্ট, যদিও এটি প্ল্যাটফর্মের নির্দিষ্টকরণের উপরও নির্ভর করবে।
হতাশ

4
যদি এটিই একমাত্র ক্ষতি হয়, তবে ধন্যবাদ - যদি এটি আমাকে আরও ভাল কোড কিনে দেয় তবে আমি যে কোনও দিন পারফরম্যান্স ছেড়ে দেব (পারফরম্যান্স-সমালোচনামূলক পাথগুলি ব্যতীত, এটি; তবে ভাগ্যক্রমে এমন সমস্ত অ্যাপ্লিকেশনগুলিতে যা কেবলমাত্র সম্পাদনা হয় তার মধ্যে কেবল 20% থাকে) -critical)।

5
@ ডেলান - না, একমাত্র ক্ষতি নয়।
ওপড

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

4
"ব্যতিক্রম হ্যান্ডলিং প্রবাহ নিয়ন্ত্রণ পরিচালনা করার জন্য একটি ব্যয়বহুল উপায় হয়ে থাকে"। পাইথনের পক্ষে মিথ্যা।
এস .লট

17

আমি সবেমাত্র আমাদের সংস্থাগুলির অ্যাপ্লিকেশনটিতে কিছু সুন্দর কোড আবিষ্কার করেছি যা ট্রায়াল-ক্যাচ ব্লকগুলি লজিকাল অপারেটর হিসাবে ব্যবহার করে। অর্থ, "কিছু কোড করুন, যদি এই ত্রুটিটি ছুড়ে দেয় তবে এই কোডটি করুন, তবে যদি এই ত্রুটিটি ছুড়ে ফেলে তবে পরিবর্তে এই 3 য় জিনিসটি করুন"। এটি "শেষ "টিকে" অন্য "বিবৃতি হিসাবে উপস্থিত হিসাবে এটি ব্যবহার করে। আমি জানি যে এটি সহজাতভাবে ভুল ...

আপনি সেটা কিভাবে জানেন? আমি "জ্ঞান" এই ধরণের সমস্ত ছেড়ে দিয়েছি এবং এখন কেবল বিশ্বাস করি যে সর্বাধিক সরল কোডটি সর্বোত্তম। মনে করুন আপনি কোনও স্ট্রিংকে Oচ্ছিকতে রূপান্তর করতে চান যা পার্স ব্যর্থ হলে খালি। এতে কোনও ভুল নেই:

try { 
    return Optional.of(Long.valueOf(s)); 
} catch (NumberFormatException) { 
    return Optional.empty(); 
}

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

ব্যতিক্রমগুলি স্বাভাবিক প্রবাহ থেকে ত্রুটি পরিচালনার পৃথকীকরণের অনুমতি দিয়ে কোডকে সহজতর করে। কেবলমাত্র সহজতম কোডটি লিখুন এবং যদি চেষ্টা-ব্যবহার বা কোনও ব্যতিক্রম ছুঁড়ে ফেলা সহজ হয় তবে তা করুন।

ব্যতিক্রমগুলি কোডের মাধ্যমে পাথের সংখ্যা হ্রাস করে পরীক্ষা সহজতর করে। কোনও শাখাবিহীন একটি ফাংশন হয় সম্পূর্ণ বা ব্যতিক্রম ছুঁড়ে ফেলবে। ifত্রুটি কোডগুলি পরীক্ষা করার জন্য একাধিক বিবৃতি সহ একটি কার্যক্রমে অনেকগুলি সম্ভাব্য পথ রয়েছে। শর্তগুলির একটির ভুল পাওয়া, বা একটি সম্পূর্ণরূপে ভুলে যাওয়া খুব সহজ, যাতে কিছু ত্রুটির শর্ত এড়ানো যায়।


4
আমি মনে করি এটি আসলে বেশ ভাল যুক্তি। আপনার কোডটি পরিষ্কার এবং সংক্ষিপ্ত এবং এটি কী করছে তা বোঝায়। এটি আসলে আমি যে কোডটি দেখছি তাতে যা ঘটছে তার অনুরূপ, কেবল এটি আরও জটিল, নেস্টেড এবং কোডের 30+ লাইন বিস্তৃত।
জেমস পি রাইট

@ জেমস: আপনি কিছু ছোট পদ্ধতি বের করে নিলে কোডটি ঠিক থাকবে বলে মনে হচ্ছে।
কেভিন

1
কেউ তর্ক করতে পারে যে জাভা সত্যিই সি # এর ট্রাই পার্সির মতো আরও কিছু ব্যবহার করতে পারে। সি # তে কোডটি হবে int i; if(long.TryParse(s, out i)) return i; else return null;। স্ট্রিংকে বিশ্লেষণ করতে না পারলে ট্রাইপার্স মিথ্যা প্রত্যাবর্তন করে। যদি এটি বিশ্লেষণ করা যায় তবে পার্সিংয়ের ফলাফলগুলিতে আউটপুট আর্গুমেন্ট সেট করে এবং সত্যে ফিরে আসে। কোনও ব্যতিক্রম ঘটে না (এমনকি ট্রাইপার্সিতে অভ্যন্তরীণভাবেও) এবং বিশেষত কোনও ধরণের ব্যতিক্রম নেই যার অর্থ প্রোগ্রামার ত্রুটি, নেট। FormatExceptionসর্বদা নির্দেশ করে।
কেভিন ক্যাথকার্ট

1
@ কেভিন ক্যাথকার্ট, তবে কেন এটি আরও ভাল? কোডফর্ম্যাটেক্সেক্সেশনটি ধরা কোডটি আমার কাছে আরও স্পষ্ট হয় তারপরে ট্রায়পার্সের ফলাফলটি নালার জন্য পরীক্ষা করে দেখানো।
উইনস্টন ইওয়ার্ট

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

12

ব্যতিক্রমগুলি ব্যবহার করে নিয়ন্ত্রণ প্রবাহ সঞ্চালিত হলে ডিবাগ এবং রক্ষণাবেক্ষণের কাজটি খুব কঠিন।

অন্তর্নিহিতভাবে, ব্যতিক্রমগুলি আপনার প্রোগ্রামের সাধারণ নিয়ন্ত্রণ প্রবাহকে পরিবর্তনের জন্য একটি পদ্ধতি হিসাবে ডিজাইন করা হয়েছে - অস্বাভাবিক ক্রিয়াকলাপ সম্পাদন করা, অস্বাভাবিক পার্শ্ব-প্রতিক্রিয়া সৃষ্টি করে, একটি বিশেষভাবে টান বাঁধন থেকে বেরিয়ে আসার উপায় হিসাবে যা কম জটিলতার সাথে পরিচালনা করা যায় না ex উপায়। ব্যতিক্রম ব্যতিক্রম। এর অর্থ এই যে আপনি কোন নির্দিষ্ট পরিবেশে কাজ করছেন তার উপর নির্ভর করে নিয়মিত নিয়ন্ত্রণ প্রবাহের ক্ষেত্রে ব্যতিক্রমের কারণ হতে পারে:

  • অপারগতা ব্যতিক্রমগুলির জন্য অপেক্ষাকৃত কঠিন প্রসঙ্গের পরিবর্তনগুলি নিরাপদে সম্পাদন করতে পরিবেশটিকে যে অতিরিক্ত হুপ দিয়ে যেতে হয় তার জন্য উপকরণ এবং সংস্থান প্রয়োজন।

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

  • রক্ষণাবেক্ষণের সমস্যাগুলি এক্সিকিউশন ফ্লো ব্যতিক্রমের লাফের মধ্য দিয়ে অনুসরণ করা শক্ত। এর বাইরে, কালো-বাক্স টাইপ কোডটি ভিতরে থেকে একটি ব্যতিক্রম ছুঁড়ে ফেলা হতে পারে, যা কোনও ব্যতিক্রম ছুঁড়ে দেওয়ার সময় বুঝতে সহজ উপায় নাও করতে পারে।

  • দুর্বল নকশার সিদ্ধান্তগুলি এই পদ্ধতিতে নির্মিত প্রোগ্রামগুলি মনের একটি ফ্রেমকে উত্সাহ দেয় যা বেশিরভাগ ক্ষেত্রে সহজেই সমস্যাগুলি সমাধান করার জন্য সহজেই মানচিত্র তৈরি করে না। চূড়ান্ত কর্মসূচির জটিলতা প্রোগ্রামারকে সম্পূর্ণরূপে কার্যকর করার বিষয়টি বোঝার থেকে নিরুৎসাহিত করে এবং এমন সিদ্ধান্ত গ্রহণে উত্সাহ দেয় যা উচ্চ দীর্ঘমেয়াদী ব্যয়ের সাথে স্বল্পমেয়াদী উন্নতি সাধন করে।


10

আমি এই প্যাটার্নটি বেশ কয়েকবার ব্যবহার করেছি।

দুটি বড় সমস্যা রয়েছে:

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

2
এটি কেবল সেখানে রেখে দেওয়া, যদি / অন্যটিও লাফিয়ে ধরা হয়। পার্থক্যটি হ'ল এটি একটি লাফ যা কেবলমাত্র সেই নির্দিষ্ট স্থানেই ঘটতে পারে (এবং এটি অনেক সহজ পড়তে পারে) এবং আপনাকে লেবেলের নামগুলি সম্পর্কে চিন্তা করতে হবে না (যা আপনাকে চেষ্টা করে / ধরতে হবে না) , তবে গোটোর সাথে তুলনা করা)। তবে কেবল "এটি একটি লাফ, যা খারাপ" এটিও বলে যে যদি / অন্যটি খারাপ হয়, যখন তা হয় না।
jsternberg

1
@ জাস্টারবার্গ: হ্যাঁ, যদি / অন্যথায় বাস্তবে মেশিন পর্যায়ে লাফিয়ে পড়ার জন্য কম্পাইল করা হয় তবে ভাষা স্তরে লাফের লক্ষ্যটি পরবর্তী বিবৃতি, যখন লুপগুলির ক্ষেত্রে এটি বর্তমান বক্তব্য। আমি যুক্তি দিয়ে বলব যে এটি এক লাফের চেয়েও এক ধাপ বেশি;)
back2dos

9

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

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

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

এই সমস্ত বলেছে, ব্যতিক্রমগুলির ব্যবহার বেশ কয়েকটি কারণে সীমাবদ্ধ করা উচিত:

  1. নেস্টেড ব্যতিক্রমগুলি দুর্ঘটনাক্রমে গিলে ফেলছে। এটি প্রধান। যদি আপনি কিছু গভীরভাবে নেস্টেড ব্যতিক্রম ধরা পড়েন যা অন্য কেউ হ্যান্ডেল করার চেষ্টা করছে, আপনি কেবলমাত্র আপনার সহকর্মী প্রোগ্রামারকে (সম্ভবত আপনিও!) পায়ে গুলি করেছেন।
  2. টেস্টগুলি অ-সুস্পষ্ট হয়ে যায়। কোডের একটি ব্লক যার এতে ব্যতিক্রম রয়েছে তার বেশ কয়েকটি জিনিসের সাথে এটির ভুল থাকতে পারে। অন্যদিকে একটি বুলিয়ান, তাত্ত্বিকভাবে এটি ডিবাগ করার জন্য বিরক্তিকর হতে পারে, এটি সাধারণত হয় না। এটি বিশেষত সত্য কারণ try...catchকন্ট্রোল ফ্লো অনুসরণকারীরা সাধারণত (আমার অভিজ্ঞতায়) "ট্রাই ব্লকে মিনিমাইজ কোড" দর্শন অনুসরণ করেন না।
  3. এটি কোনও else ifব্লকের অনুমতি দেয় না । যথেষ্ট বলেছিলেন (এবং যদি কেউ "তবে তারা বিভিন্ন ব্যতিক্রম শ্রেণি ব্যবহার করতে পারে" এর সাথে পাল্টা পরামর্শ দেয় তবে আমার প্রতিক্রিয়া হ'ল "আপনার ঘরে যান এবং আপনি যা বলেছিলেন তা ভেবে না আসা পর্যন্ত বাইরে আসবেন না।")
  4. এটি ব্যাকরণগতভাবে বিভ্রান্তিকর। Exception, বিশ্বের অন্যান্য অংশে (যেমন try...catchনিয়ন্ত্রণ-প্রবাহ দর্শনের অনুগামী নয় ) এর অর্থ হল যে কোনও কিছু অস্থির (যদিও সম্ভবত পুনরুদ্ধারযোগ্য) অবস্থায় প্রবেশ করেছে। অস্থিতিশীল রাজ্যগুলি খারাপ এবং এটি যদি আমাদের কাছে অবাস্তব ব্যতিক্রম হয় (তবে এটি আসলে আমাকে ছাড়িয়ে দেয়, কোনও মিথ্যা কথা নয়) রাতে আমাদের সকলকে রাখা উচিত।
  5. এটি সাধারণ কোডিং শৈলীর সাথে সম্মতিযুক্ত নয়। আমাদের কোড, আমাদের কোড এবং আমাদের ইউআই এর সাথে উভয়ই বিশ্বের যতটা সম্ভব স্পষ্ট করা। try...catchনিয়ন্ত্রণ-প্রবাহ সাধারণত সর্বোত্তম অনুশীলন হিসাবে বিবেচিত হয় তার বিপরীতে যায়। এর অর্থ প্রকল্পটিতে নতুন কারও জন্য এই প্রকল্পটি শিখতে আরও বেশি সময় লাগে, যার অর্থ একেবারে কোনও লাভের জন্য ম্যান-ঘন্টার সংখ্যা বৃদ্ধি।
  6. এটি প্রায়শই কোড ডুপ্লিকেশন বাড়ে। অবশেষে ব্লকগুলি, যদিও এটি কঠোরভাবে প্রয়োজনীয় নয়, সমস্ত ঝুঁকিপূর্ণ পয়েন্টারগুলি সমাধান করা দরকার যা বাধা চেষ্টা ব্লক দ্বারা উন্মুক্ত রেখেছিল। সুতরাং ব্লক চেষ্টা করুন। এর অর্থ আপনার একটি থাকতে পারে try{ obj.openSomething(); /*something which causes exception*/ obj.doStuff(); obj.closeSomething();}catch(Exception e){obj.closeSomething();}। আরও বেশি traditionalতিহ্যবাহী, if...elseদৃশ্যে, closeSomething()অনুলিপি করা এবং কাস্ট করার কাজ হওয়ার সম্ভাবনা কম (আবারও ব্যক্তিগত অভিজ্ঞতা)। (স্বীকারযোগ্য যে, প্রকৃত দর্শনের চেয়ে আমি যাদের সাথে সাক্ষাত করেছি তাদের সাথে এই বিশেষ যুক্তির আরও বেশি সম্পর্ক রয়েছে)।

আফাইক, # 6 কেবল জাভাতে একটি সমস্যা, যা অন্য সমস্ত আধুনিক ভাষার মতো নয়, ক্লোজার বা স্ট্যাক-ভিত্তিক সংস্থান ব্যবস্থাপনা নেই। এটি অবশ্যই ব্যতিক্রমগুলির ব্যবহারের অন্তর্নিহিত কোনও সমস্যা নয়।
কেভিন

4 এবং 5 আমার কাছে একই পয়েন্ট বলে মনে হচ্ছে। আপনার ভাষা অজগর হলে 3-6 প্রয়োগ করবেন না। 1 এবং 2 হ'ল সম্ভাব্য সমস্যা, তবে আমি মনে করি চেষ্টা ব্লকে কোড হ্রাস করে এগুলি পরিচালনা করা হয়।
উইনস্টন ইওয়ার্ট

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

3) ব্যতিক্রমগুলির জন্য পাইথনের একটি অন্য ব্লক রয়েছে। আপনি সাধারণত 1 এবং 2 এর জন্য যে সমস্যাগুলি পান তা এড়াতে এটি ব্যাপকভাবে সহায়ক
উইনস্টন ইওয়ার্ট

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

4

আমার মূল যুক্তি হ'ল লজিকের জন্য ট্র্যাচ / ক্যাচ ব্যবহার করা লজিক্যাল প্রবাহকে ভেঙে দেয়। অ-যুক্তিযুক্ত নির্মাণের মাধ্যমে "যুক্তি" অনুসরণ করা (আমার কাছে) পাল্টা স্বজ্ঞাত এবং বিভ্রান্তিকর। আমার যুক্তি "যদি শর্ত হয় তবে অন্য কোনও বি" হিসাবে পড়তে অভ্যস্ত। "একটি ক্যাচ চেষ্টা করুন তারপরে বি চালাও" হিসাবে একই বিবৃতিটি পড়া অদ্ভুত মনে হয়। এমনকি বিবৃতিটি Aযদি একটি সাধারণ অ্যাসাইনমেন্ট হয় তবে এটি আরও অযৌক্তিক হবে , যদি conditionমিথ্যা হয় তবে ব্যতিক্রম করার জন্য অতিরিক্ত কোডের প্রয়োজন হয় (এবং এটি করা সম্ভবত সম্ভবত ifস্টেস্টমেন্টের প্রয়োজন হবে )।


2

ঠিক আছে, শিষ্টাচারের বিষয়, "তাদের সাথে তর্ক শুরু করার আগে", যেমনটি আপনি বলেছেন, আমি দয়া করে জিজ্ঞাসা করব "তারা কেন এই সমস্ত ভিন্ন জায়গায় ব্যতিক্রম হ্যান্ডলিং ব্যবহার করে?"

মানে, এখানে বেশ কয়েকটি সম্ভাবনা রয়েছে:

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

... আমি মনে করি এগুলি সবই সমান সম্ভাবনাযুক্ত। সুতরাং তাদের সুন্দরভাবে জিজ্ঞাসা করুন।


1

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

সম্পাদনা করুন:

কারণ: আপনি তর্ক করতে পারেন যে আপনি যদি কন্ডিশনাল অপারেটর হিসাবে ক্যাচ ব্যবহার করে থাকেন তবে আপনি কীভাবে বাস্তব ব্যতিক্রমের জন্য অ্যাকাউন্ট করবেন?


2
ওপি কারণ / যুক্তি জিজ্ঞাসা করছে। আপনি কোনও সরবরাহ করেন নি।
ওডে

"আপনি তর্ক করতে পারেন যে আপনি যদি শর্তসাপেক্ষ অপারেটর হিসাবে ক্যাচ ব্যবহার করে থাকেন তবে বাস্তব ব্যতিক্রমগুলির জন্য আপনি কীভাবে অ্যাকাউন্টে যাচ্ছেন?" - catch"অ-বাস্তব" ব্যতিক্রমগুলি ধরা যায় তার থেকে পৃথক ধারাটিতে সেই আসল ব্যতিক্রমগুলি ধরা?

@ ডেলান - ধন্যবাদ! আমি প্রমাণ করতে পেরেছিলাম যে আমি তৈরি করতে যাচ্ছিলাম। যদি কোনও ব্যক্তি আপনার যুক্তিটি কেবল আমার কারণ হিসাবে বলে থাকে এবং ওদেদ আমি কেবল কথা বলা বন্ধ করে দেব কারণ তিনি সন্ধান করছেন না কারণ তিনি কেবল অনড় হয়ে আছেন এবং আমি আমার জেদ দিয়ে সময় নষ্ট করি না।
এজেসি

আপনি আমাকে স্টাডোবেন বলছেন কারণ আমি এখানে তালিকাভুক্ত কিছু যুক্তিতে ত্রুটিগুলি দেখিয়েছি? এখানে বর্ণিত অন্যান্য পয়েন্টগুলির বিরুদ্ধে আমার কীভাবে বলার কিছুই নেই তা নোট করুন। আমি প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রমগুলি ব্যবহার করার অনুরাগী নই (যদিও আমি বিবরণ ব্যতীত কোনও কিছুর নিন্দা করব না, অতএব ওপি দ্বারা বিবরণের জন্য আমার জিজ্ঞাসা), আমি কেবল শয়তানের উকিল খেলছি।

1
শর্তসাপেক্ষ অপারেটর হিসাবে ট্র্যাচ-ক্যাচ ব্যবহার করা কোনওভাবেই "আসল" ব্যতিক্রমগুলি ধরতে কাজ করা থেকে বাধা দেয়।
উইনস্টন ইওয়ার্ট

1

ব্যতিক্রম যখন ব্যতিক্রমী জিনিস ঘটে তখনই হয়। প্রোগ্রামটি কি নিয়মিত কর্মপ্রবাহ ব্যতিক্রমী অনুসারে কাজ করছে?


1
কিন্তু কেন? প্রশ্নের মূল বিষয় হল কেন (বা কেন নয়) ব্যতিক্রমগুলি কেবল তার জন্য ভাল।
উইনস্টন ইওয়ার্ট

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

1
-1: টোটোলজিক্যাল স্টেটমেন্ট
ভাত ময়দা কুকিজ

1

ব্যতিক্রমগুলি ব্যবহার করার কারণ:

  1. যদি আপনি কোনও ব্যতিক্রমী পরিস্থিতি ধরতে ভুলে যান তবে আপনার প্রোগ্রামটি মারা যাবে এবং স্ট্যাক ট্রেস আপনাকে সঠিক কারণটি বলবে। আপনি যদি কোনও ব্যতিক্রম পরিস্থিতিতে রিটার্ন মানটি পরিচালনা করতে ভুলে যান তবে আপনার প্রোগ্রামটি কত দূরে ভুল আচরণ প্রদর্শন করবে তা বলছে না।
  2. রিটার্ন মানগুলি ব্যবহার করা কেবল তখনই কাজ করে যদি সেখানে কোনও প্রেরক মান থাকে যা আপনি ফিরে আসতে পারেন। যদি সম্ভাব্য সমস্ত রিটার্ন মান ইতিমধ্যে বৈধ হয় তবে আপনি কী করতে যাচ্ছেন?
  3. ব্যতিক্রম কী হতে পারে যা দরকারী হতে পারে সে সম্পর্কে অতিরিক্ত তথ্য বহন করবে।

ব্যতিক্রমগুলি ব্যবহার না করার কারণগুলি:

  1. অনেকগুলি ভাষা ব্যতিক্রমগুলি দ্রুত তৈরি করার জন্য তৈরি করা হয়নি।
  2. ব্যতিক্রমগুলি যা স্ট্যাকের উপরে বেশ কয়েকটি স্তর ভ্রমণ করে তাদের অনুসরণের ক্ষেত্রে অসঙ্গতিপূর্ণ অবস্থা ছেড়ে দিতে পারে

শেষে:

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


0

আমি চেষ্টা -> কিছু পরিস্থিতিতে প্রবাহ নিয়ন্ত্রণ হিসাবে ধরা। যদি আপনার প্রাথমিক যুক্তি ব্যর্থ হয় এমন কোনও কিছুর উপর নির্ভর করে তবে আপনি কেবল একটি ব্যতিক্রম ছুঁড়ে ফেলে দিতে চান না ... এটি চেষ্টা-> ক্যাচ ব্লক এর জন্য block আমি প্রচুর অযৌক্তিক সার্ভারের পাশের ইউনিক্স স্ক্রিপ্টগুলি লিখি এবং এটির জন্য ব্যর্থ না হওয়া তার চেয়ে অনেক বেশি গুরুত্বপূর্ণ, যা তাদের প্রেটিভলি ব্যর্থ হওয়ার চেয়ে বেশি।

সুতরাং প্ল্যান এ-এর চেষ্টা করুন , এবং প্ল্যান এ যদি মারা যায়, প্ল্যান বি দিয়ে ধরুন এবং চালনা করুন ... এবং যদি পরিকল্পনা বি ব্যর্থ হয়, অবশেষে প্ল্যান সিটিকে সরিয়ে ফেলতে ব্যবহার করুন , যা হয় A বা B, বা পৃষ্ঠায় ব্যর্থ পরিষেবাগুলির মধ্যে একটি স্থির করবে আমাকে.


0

এটি ভাষা এবং সম্ভবত ব্যবহারের প্রয়োগের উপর নির্ভর করে। সি ++ এর মানটি হ'ল ব্যতিক্রমগুলি সত্যিকারের ব্যতিক্রমী ইভেন্টগুলির জন্য সংরক্ষণ করা উচিত। অন্যদিকে পাইথনে গাইডলাইনগুলির মধ্যে একটি হ'ল " অনুমতি চেয়ে ক্ষমা চাওয়া সহজ ", সুতরাং প্রোগ্রামের যুক্তিতে ব্লক ব্যতীত চেষ্টা করার / একীকরণকে উত্সাহ দেওয়া হয়।


"সি ++ এর মানটি হ'ল ব্যতিক্রমগুলি সত্যিকারের ব্যতিক্রমী ইভেন্টগুলির জন্য সংরক্ষণ করা উচিত" " এটা অপদার্থ. এমনকি ভাষার উদ্ভাবকও আপনার সাথে একমত নন
arayq2

-1

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

তবুও, অতিরিক্ত ব্যবহার করা এটি একটি খারাপ অভ্যাস।


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

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

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

1
এটি কোনও খারাপ অভ্যাস নয়। পাইথনে এটির প্রস্তাবিত স্টাইল।
উইনস্টন ইওয়ার্ট

@ back2dos, ডাটাবেস / ফাইল সিস্টেমের অন্যান্য ব্যবহারকারীর মতো বাহ্যিক সংস্থার সাথে কাজ করার সময় কি আপনি এড়াতে পারবেন?
উইনস্টন ইওয়ার্ট

-1

অ্যাপল যেভাবে এটি সংজ্ঞায়িত করেছে তা পছন্দ করি: ব্যতিক্রমগুলি কেবল প্রোগ্রামার ত্রুটি এবং মারাত্মক রানটাইম ত্রুটির জন্য। অন্যথায় ত্রুটি কোড ব্যবহার করুন। "কখন এটি প্রোগ্রামার ত্রুটি ছিল?"


-1

এটি গোটো কমান্ড নেই এমন একটি ভাষার শীর্ষে গোটো লজিক তৈরি করতে ব্যতিক্রম হ্যান্ডলিং ব্যবহার করার মতো বলে মনে হচ্ছে।

গোটো লজিক খারাপ হওয়ার কারণগুলির জন্য আপনি এই প্রশ্নটি উল্লেখ করতে পারেন: https://stackoverflow.com/questions/46586/goto-still-considered-harmful

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