জাভাতে কি ব্যতিক্রমগুলি চেক করা ভাল? [বন্ধ]


14

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

আমি ব্যক্তিগতভাবে তাদের জন্য একটি স্তর খুঁজে পেয়েছি ( স্তরগুলির মধ্যে ব্যবসায়িক যুক্তিতে ) তবে অন্যথায় আমি বেশ বিরোধী-ব্যতিক্রম ব্যতিক্রম।

অন্য কোন ব্যবহার আছে যা আমি বুঝতে পারি না?


সমস্ত জাভা কোর লাইব্রেরিগুলি বেশ বিস্তৃতভাবে চেক করা ব্যতিক্রমগুলি ব্যবহার করে।
জুনাস পুলক্কা

3
@ জুনাস আমি জানি, এবং এটি একটি ব্যথা!
ব্র্যাড কাপিট

উত্তর:


22

প্রথমত, অন্যান্য প্রোগ্রামিং দৃষ্টান্তের মতো এটির কাজটি করার জন্য আপনার এটি করা উচিত।

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

আমি চেক করা ব্যতিক্রমগুলি পছন্দ করি কারণ যত তাড়াতাড়ি সম্ভব ত্রুটি পুনরুদ্ধারের বিষয়ে আমাকে ভাবতে বাধ্য করে তারা আমার কোডটিকে আরও শক্তিশালী করে।

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

এটি হতে পারে যে অনুপস্থিত ফাইলটি মারাত্মক জিনিস এবং প্রোগ্রামটিকে শিখায় বিপর্যয়ের কারণ হতে পারে তবে তারপরে আপনি সিদ্ধান্তটি নিয়ে

} catch (FileNotFoundException e) {
  throw new RuntimeException("Important file not present", e);
}

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

লোকেরা বলতে পারে "আমরা পুনরুত্পাদন করার জন্য এটি কেবলমাত্র ডিবাগারে চালাতে পারি", তবে আমি দেখতে পেয়েছি যে খুব ঘন ঘন উত্পাদনের ত্রুটিগুলি পরে পুনরুত্পাদন করা যায় না, এবং আমরা খুব খারাপ কাজগুলি বাদ দিয়ে প্রযোজনায় ডিবাগারগুলি চালাতে পারি না যেখানে মূলত আপনার কাজ ঝুঁকির মধ্যে রয়েছে।

আপনার স্ট্যাক ট্রেস আরও তথ্য, আরও ভাল। চেক করা ব্যাতিক্রমগুলি আমাকে সেই তথ্য এবং সেখানে প্রাথমিক দিকে পেতে সহায়তা করে।


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


+1 টি। স্প্রিংয়ের ডিজাইনাররা প্রচুর হাইবারনেট ব্যতিক্রমগুলি চেক করা ব্যতিক্রমগুলিতে অনুবাদ করার জন্য ভাল কাজ করেছিলেন।
ফিল্ম

এফওয়াইআই: ফ্রাঙ্ক সোমাররা এই থ্রেডে উল্লেখ করেছে যে দোষ-সহনশীল সফ্টওয়্যার প্রায়শই একই পদ্ধতিতে নির্ভর করে। সম্ভবত আপনি আপনার উত্তরটি পুনরুদ্ধারযোগ্য কেস এবং মারাত্মক মামলায় ভাগ করতে পারেন।
রওয়ং

@ রুং, আপনি কি মনে মনে আরও বিস্তারিতভাবে বলতে পারেন?

11

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

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

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

data Foo a =
     Success a
   | DidNotWorkBecauseOfA
   | DidNotWorkBecauseOfB

এটি প্রোগ্রামারকে বলে যে ফাংশনটির সাফল্যের পাশাপাশি দুটি অতিরিক্ত সম্ভাব্য ফলাফল রয়েছে।


প্রকারের সুরক্ষা সম্পর্কে চেক করা ব্যতিক্রমগুলির জন্য +1। আমি এই ধারণাটি আগে কখনও শুনিনি, তবে এটি এত তাৎপর্যপূর্ণ করে তোলে।
Ixrec

11

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

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

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

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

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

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


ব্যতিক্রমটি সরাসরি পরিচালনা করার বিষয়ে আপনার প্রথম প্রাথমিক বক্তব্য ইতিমধ্যে মিথ্যা; আপনি কেবল একটি থ্রো স্টেটমেন্ট যুক্ত করতে পারেন, এবং এটি নিক্ষেপ বিবৃতিটি পিতামাতার ধরণের হতে পারে। তদুপরি, যদি আপনি সত্যিই এটি পরিচালনা করতে চান না তবে আপনি কেবল এটির পরিবর্তে একটি রানটাইম এক্সেকসেপ্টে রূপান্তর করতে পারেন। আইডিই সাধারণত দুটি কাজেই আপনাকে সহায়তা করে।
মার্টেন বোদেউয়েস

2
@ আওলস্টেড: ধন্যবাদ - আমার সম্ভবত সেখানে শব্দটির প্রতি আরও যত্নবান হওয়া উচিত ছিল। বিন্দুটি এতটা ছিল না যে আপনাকে আসলে ব্যতিক্রমটি ধরতে হয়েছিল কারণ এটি ছিল যে প্রতিটি মধ্যবর্তী স্তরের কোডটি প্রতিটি ব্যতিক্রম সম্পর্কে সচেতন হওয়া দরকার যা এটির মধ্য দিয়ে প্রবাহিত হতে পারে। বাকী হিসাবে: আপনার সরঞ্জামের একটি জগাখিচুড়ি করা দ্রুত এবং সহজ করে তোলে এমন একটি সরঞ্জাম থাকার ফলে এটি কোডটির গোলমাল করছে।
জেরি কফিন

চেক ইন ব্যতিক্রম জন্য দেয়ার উদ্দেশ্যে করা হয় সম্ভাব্য - আন্দাজের & আদায়যোগ্য ফলাফল, সাফল্য ছাড়া অন্য থেকে স্বতন্ত্র হিসাবে ব্যর্থতা - অনিশ্চিত নিম্নস্তরের / অথবা সিস্টেম সমস্যা। ফাইলনটফাউন্ড বা জেডিবিসি সংযোগ খোলার ক্ষেত্রে ত্রুটি উভয়ই সঠিকভাবে বিবেচনা করা হয়েছিল आकस्मिक অবস্থা। দুর্ভাগ্যক্রমে, জাভা লাইব্রেরি ডিজাইনাররা মোট ভুল করেছে এবং অন্য সমস্ত আইও এবং এসকিউএল ব্যতিক্রমকে 'চেকড' শ্রেণিতেও নিয়োগ করেছে; এগুলি সত্ত্বেও প্রায় সম্পূর্ণ অপরিশোধনযোগ্য। litratejava.com/exception/…
টমাস ডাব্লু

@ ওয়ালস্টেড: চেক করা ব্যতিক্রমগুলি কেবলমাত্র কল স্ট্যাকের মধ্যবর্তী স্তরগুলির মধ্য দিয়ে বুদবুদ হওয়া উচিত যদি সে ক্ষেত্রে যদি মধ্যবর্তী কলিং কোড আশা করে তবে তাদের ফেলে দেওয়া হয় । আইএমএইচও, চেক করা ব্যতিক্রমগুলি যদি কলকারীরা তাদের ধরতে হয় বা তাদের প্রত্যাশিত ছিল কি না তা নির্দেশ করতে হত তবে খুব ভাল হত ; অপ্রত্যাশিত ব্যতিক্রমগুলি UnexpectedExceptionথেকে প্রাপ্ত কোনও প্রকারে স্বয়ংক্রিয়ভাবে মোড়ানো উচিত RuntimeException। নোট করুন যে "নিক্ষেপ" এবং "প্রত্যাশা করে না" পরস্পরবিরোধী নয়; যদি fooছোঁড়ে BozExceptionএবং কল করে bar, এর অর্থ এটি barনিক্ষেপ করার প্রত্যাশা নয় BozException
সুপারক্যাট

10

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


4
সহজ ফিক্স: throws FileNotFoundException। হার্ড ফিক্স:catch (FileNotFoundException e) { throw RuntimeException(e); }
টমাস এডিং

5

আমি মনে করি যে এটা বলা ঠিক হবে যে চেক করা ব্যতিক্রমগুলি কিছুটা ব্যর্থ পরীক্ষামূলক ছিল। যেখানে তারা ভুল হয়েছে তারা হ'ল লেয়ারিং ভেঙেছে:

  • মডিউল একটি মডিউল বি এর উপরে নির্মিত হতে পারে, যেখানে
  • মডিউল বি মডিউল সি এর উপরে নির্মিত হতে পারে
  • মডিউল সি হয়ত একটি ত্রুটি সনাক্ত করতে পারে এবং
  • মডিউল এ হয়ত ত্রুটিটি পরিচালনা করতে পারে know

উদ্বিগ্নদের সুন্দর বিভাজনটি ভেঙে গেছে, কারণ এখন যে ত্রুটিগুলি এ এবং সি এর মধ্যে সীমাবদ্ধ থাকতে পারে তার জ্ঞান এখন বি বিভক্ত করতে হবে because

উইকিপিডিয়ায় চেক ব্যাতিক্রমের একটি সুন্দর আলোচনা রয়েছে।

এবং ব্রুস এক্কেলের পাশাপাশি এটিতে একটি দুর্দান্ত নিবন্ধ রয়েছে । এখানে একটি উদ্ধৃতি:

[টি] তিনি আপনাকে আরও বেশি এলোমেলোভাবে প্রোগ্রামারের উপরে চাপ দিয়ে বিধি বিধান করে, এমন নিয়ম যার হাতের কাছে সমস্যা সমাধানের কোনও সম্পর্ক নেই, প্রোগ্রামার যত ধীরে ধীরে তৈরি করতে পারে। এবং এটি একটি লিনিয়ার ফ্যাক্টর হিসাবে উপস্থিত হয় না, তবে একটি ঘনিষ্ঠ

আমি সি ++ এর ক্ষেত্রে বিশ্বাস করি, যদি সমস্ত পদ্ধতির throwsস্পেসিফিকেশন ধারা থাকে তবে আপনার কিছু সুন্দর অপ্টিমাইজেশন থাকতে পারে। আমি বিশ্বাস করি না যে জাভা যে কোনও উপায়ে থাকতে পারে তবে RuntimeExceptionsতা যাচাই করা হয়নি। একটি আধুনিক জেআইটি যেভাবেই হোক ঠিক ঠিক কোডটি অনুকূলিত করতে সক্ষম হবে।

অ্যাসপেক্টজ-এর একটি দুর্দান্ত বৈশিষ্ট্য ব্যতিক্রম নরমকরণ: আপনি চেক করা ব্যতিক্রমগুলি চেক করা ব্যতিক্রমগুলিতে পরিণত করতে পারেন, বিশেষত লেয়ারিং বাড়ানোর জন্য।

সম্ভবত বিস্ময়কর যে জাভা এই সমস্ত সমস্যার মধ্য দিয়ে গেছে, যখন এটির nullপরিবর্তে এটি পরীক্ষা করতে পারত , যা সম্ভবত আরও মূল্যবান হতে পারে


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

3
নাল চেক করা অনেক বেশি ব্যথা - আপনাকে সর্বদা পরীক্ষা করতে হবে - প্লাস এটি কারণ ব্যাখ্যা করতে পারে না, যা একটি নামযুক্ত ব্যতিক্রম করে।

5

আমি ব্যতিক্রম পছন্দ করি।

আমি অবশ্য ক্রমাগত তাদের মিস-ব্যবহার দ্বারা বিভ্রান্ত হয়ে পড়েছি।

  1. এগুলি ফ্লো হ্যান্ডলিংয়ের জন্য ব্যবহার করবেন না। আপনি এমন কোড চান না যা কিছু করার চেষ্টা করে এবং পরিবর্তে অন্য কিছু করার জন্য একটি ব্যতিক্রম হিসাবে ব্যতিক্রম ব্যবহার করে কারণ ব্যতিক্রমগুলি এমন একটি বস্তু যা তৈরি করতে হবে এবং মেমরি ব্যবহার করতে হবে ইত্যাদি ইত্যাদি। কারণ আপনাকে কিছু লিখতে বিরক্ত করা যায়নি ceptions আপনার কল করার আগে () পরীক্ষা করে দেখুন। এটি কেবল অলস এবং গৌরবময় ব্যতিক্রমকে একটি খারাপ নাম দেয়।

  2. তাদের গ্রাস করবেন না। কখনো। যেকোনো পরিস্তিথিতে. নিরঙ্কুশতম ন্যূনতম হিসাবে আপনি কোনও ব্যতিক্রম ঘটেছে তা বোঝাতে আপনার লগ ফাইলে কিছু আটকে থাকেন। ব্যতিক্রমগুলি গ্রাস করে এমন কোডের মাধ্যমে আপনার পথ ট্র্যাক করার চেষ্টা করা দুঃস্বপ্ন। আবার শক্তিশালী ব্যতিক্রমটিকে অসম্মানে আনার জন্য আপনাকে ব্যতিক্রম-গিলে ফেলা অভিশাপ!

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

  4. আপনি যদি কোডের 'কাঠামোগত' বিট লিখছেন তবে নিশ্চিত হোন যে আপনার সমস্ত প্রাথমিক ইন্টারফেসগুলি আপনার নিজের নতুন ব্যতিক্রম যেখানে উপযুক্ত সেখানে নিক্ষেপ করার জন্য লিখিত হয়েছে ... এবং নিশ্চিত করুন যে আপনার কোডারদের যখন তাদের কোড রয়েছে তখন কি করবেন সেই জায়গার আশেপাশে কিছু নমুনা কোড রয়েছে? একটি আইওএক্সেপশন নিক্ষেপ করে তবে তারা যে ইন্টারফেসটি লিখছে তা 'রিপোর্টিং অ্যাপ্লিকেশনএক্সেপশন' নিক্ষেপ করতে চায়।

আপনি কীভাবে ব্যতিক্রমগুলি আপনার পক্ষে কাজ করবেন তা তৈরি করার পরে আপনি আর পিছনে ফিরে তাকাবেন না।


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

3
আমি অভদ্র হতে চাই না তবে এটির চেক করা ব্যতিক্রমগুলির সাথে কী আছে? :)
পাল্টো

চেক করা ব্যতিক্রমগুলির নিজস্ব শ্রেণিবিন্যাস লিখতে আবারও লেখা যেতে পারে ।
মার্টেন বোদেউয়েস

4

পরীক্ষিত ব্যতিক্রমগুলি এডিএতেও রয়েছে।

(সতর্কতা, এই পোস্টে দৃ strongly়ভাবে ধারণ করা বিশ্বাস রয়েছে যা আপনার মুখোমুখি হতে পারে))

প্রোগ্রামাররা এগুলি পছন্দ করে না এবং অভিযোগ করে না, বা ব্যতিক্রম গিলে কোড লেখায়।

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

ফাইল রিড ব্যর্থ হতে পারে। আরপিসি কলগুলি ব্যর্থ হতে পারে। নেটওয়ার্ক আইও ব্যর্থ হতে পারে। বিশ্লেষণের সময় ডেটা ভুল ফর্ম্যাট করা যায়।

কোডের জন্য "সুখী পথ" সহজ।

আমি বিশ্ববিদ্যালয়ের একজন লোককে জানতাম যে দুর্দান্ত "শুভ পথ" কোড লিখতে পারে। প্রান্তের কেসের কোনওটিই কাজ করেনি। আজকাল তিনি একটি ওপেন সোর্স সংস্থার জন্য পাইথন করেন। নফ বলল।

আপনি যদি চেক করা ব্যতিক্রমগুলি পরিচালনা করতে না চান তবে আপনি যা বলছেন তা হ'ল

While I'm writing this code, I don't want to consider obvious failure modes.

The User will just have to like the program crashing or doing weird things.

But that's okay with me because 

I'm so much more important than the people who will have to use the software

in the real, messy, error-prone world.

After all, I write the code once, you use it all day long.

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

অবশ্যই, অন্য লোকেরা হয়ত সেই কাজটি করতে চেয়েছিল।

ফাইল সার্ভার ব্যর্থ হয়েছে / ইউএসবি স্টিক মারা গেলেও তারা সঠিক উত্তর চেয়েছিল।

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

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


6
আপনি খুব ভাল লাগলেন।
অ্যাডাম লিয়ার

2
+1 "কোনও প্রান্তের মামলা কখনও কাজ করেনি These আজকের দিনে তিনি একটি ওপেন সোর্স সংস্থার হয়ে পাইথন করেন N নফ বলেছিলেন।" ক্লাসিক
নিমচিম্পস্কি

1
@palto: জাভা বাহিনী আপনি অ সহজ পথ বিবেচনা করতে হবে। এটাই বড় পার্থক্য। সি # এর জন্য, আপনি বলতে পারেন, "ব্যতিক্রমটি ডকুমেন্টেড" এবং এতে আপনার হাত ধুয়ে ফেলুন। তবে প্রোগ্রামাররা ত্রুটিযুক্ত। তারা জিনিস ভুলে যায়। আমি যখন কোড লিখি, তখন আমি কোনও কম্পাইলার আমাকে জানাতে পারে এমন কোনও ফাটলগুলির 100% মনে করিয়ে দিতে চাই।
থমাস এডিং

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

3
@ থমাসেডিং করা এটি উপরের সমস্ত কিছুর ইন্টারফেসকে বদলে দেবে যা প্রয়োগের প্রতিটি স্তরের অযথা প্রয়োগের বিবরণ প্রকাশ করে। আপনি কেবলমাত্র এটি করতে পারেন যদি ব্যতিক্রম এমন কিছু হয়ে থাকে যা থেকে আপনি পুনরুদ্ধার করতে চান এবং এটি ইন্টারফেসে অর্থবোধ করে। আমি আমার getPeople- পদ্ধতিতে IOException যুক্ত করতে চাই না কারণ কিছু কনফিগারেশন ফাইল অনুপস্থিত থাকতে পারে। এটা ঠিক বোঝা যায় না।
palto

4

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

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

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


2
"ব্যতিক্রম উপেক্ষা করা" প্রায়শই সঠিক - অনেক সময় ব্যতিক্রমের সর্বোত্তম প্রতিক্রিয়া হ'ল অ্যাপটি ক্রাশ হতে দেওয়া। এই দৃষ্টিকোণের জন্য তাত্ত্বিক ভিত্তির জন্য বার্ট্র্যান্ড মেয়ারের অবজেক্ট ওরিয়েন্টেড সফটওয়্যার কনস্ট্রাকশন পড়ুন । তিনি দেখান যে ব্যতিক্রমগুলি সঠিকভাবে ব্যবহার করা হলে (চুক্তি লঙ্ঘনের জন্য) মূলত দুটি সঠিক প্রতিক্রিয়া রয়েছে: (১) অ্যাপ্লিকেশনটি ক্র্যাশ করতে দিন বা (২) ব্যতিক্রমের কারণে সমস্যাটি ঠিক করতে দিন এবং প্রক্রিয়াটি পুনরায় চালু করতে দিন। বিশদ জন্য মেয়ার পড়ুন; এটি একটি মন্তব্যে সংক্ষিপ্ত বিবরণ।
ক্রেগ স্টান্টজ

1
@ ক্রেইগ স্টান্টজ, ব্যতিক্রম উপেক্ষা করে আমি তাদের গ্রাস করতে চাইছিলাম।
উইনস্টন ইওয়ার্ট

আহ, এটা আলাদা। আমি সম্মতি জানাই আপনার এগুলি গ্রাস করা উচিত নয়।
ক্রেগ স্টান্টজ

"ব্যতিক্রম উপেক্ষা করা প্রায়শই সঠিক - অনেক সময় ব্যতিক্রমের সর্বোত্তম প্রতিক্রিয়া হ'ল অ্যাপটিকে ক্রাশ হতে দেওয়া let": এটি সত্যই অ্যাপ্লিকেশনটির উপর নির্ভর করে depends ওয়েব অ্যাপ্লিকেশনটিতে যদি আপনার কোনও অপ্রকাশিত ব্যতিক্রম থাকে তবে সবচেয়ে খারাপটি ঘটতে পারে তা হ'ল আপনার গ্রাহক একটি ওয়েব পৃষ্ঠায় একটি ত্রুটি বার্তা দেখে রিপোর্ট করবেন এবং আপনি কয়েক মিনিটের মধ্যে একটি বাগ ফিক্স স্থাপন করতে পারেন। বিমান অবতরণের সময় আপনার যদি কোনও ব্যতিক্রম থাকে তবে আপনি এটিকে আরও ভালভাবে পরিচালনা করতে এবং পুনরুদ্ধার করার চেষ্টা করবেন।
জর্জিও 15

@ জর্জিও, খুব সত্য। যদিও আমি ভাবছি বিমানটি বা এর অনুরূপ ক্ষেত্রে যদি পুনরুদ্ধারের সর্বোত্তম উপায় হ'ল সিস্টেমটি পুনরায় চালু করা হয়।
উইনস্টন ইওয়ার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.