দক্ষ চেষ্টা / ব্লক ব্যবহার ধরা?


21

যুক্তি লেখার জন্য হোল্ড প্রবাহ নিয়ন্ত্রণ ইত্যাদির জন্য ক্যাচ ব্লক ব্যবহার করা উচিত? নাকি কেবল ব্যতিক্রম ছোঁড়ার জন্য? এটি কোডের দক্ষতা বা রক্ষণাবেক্ষণকে প্রভাবিত করে?

ক্যাচ ব্লকে যুক্তি লেখার পার্শ্ব প্রতিক্রিয়াগুলি (যদি থাকে তবে) কী কী?

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

আমি একটি জাভা এসডিকে ক্লাস দেখেছি যাতে তারা ক্যাচ ব্লকের ভিতরে যুক্তি লিখেছিল। উদাহরণস্বরূপ ( java.lang.Integerক্লাস থেকে নেওয়া স্নিপেট ):

        try {
            result = Integer.valueOf(nm.substring(index), radix);
            result = negative ? new Integer(-result.intValue()) : result;
        } catch (NumberFormatException e) {
            String constant = negative ? new String("-" + nm.substring(index))
                                       : nm.substring(index);
            result = Integer.valueOf(constant, radix);
        }

সম্পাদনা 2 :

আমি একটি টিউটোরিয়াল দিয়ে যাচ্ছিলাম যেখানে তারা এটিকে ব্যতিক্রমগুলির মধ্যে ব্যতিক্রমী মামলার যুক্তি লেখার সুবিধা হিসাবে গণ্য করে:

ব্যতিক্রমগুলি আপনাকে আপনার কোডের মূল প্রবাহ লিখতে এবং অন্য কোথাও ব্যতিক্রমী মামলাগুলি মোকাবেলা করতে সক্ষম করে।

ক্যাচ ব্লকে যুক্তি লেখার জন্য নির্দিষ্ট নির্দেশিকা কখন এবং কখন নয়?


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

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

4
@ কোডার নির্ভর করে। আমি মনে করি আইও করার সময়, বা প্রায় সবসময় সঠিকভাবে ফর্ম্যাট করা জটিল ডেটা পার্স করার সময় কোনও ত্রুটি চিহ্নিত করার জন্য একটি ব্যতিক্রম ছুঁড়ে দেওয়া কোডকে আরও পরিষ্কার করে তোলে।
কোডসইনচাওস

1
@ কোডড হ্যাঁ, মৃত্যুদন্ড কার্যকর করার পদ্ধতিটি আপনাকে জানাতে চেয়েছিল যে এটি এটির জন্য যা বলা হয়েছিল তা করতে অক্ষম। তবে ব্যতিক্রম প্রবাহ নিয়ন্ত্রণের জন্য ব্যবহার করা উচিত নয়, এ কারণেই সি # তেও একটি অন্তর্ঘাত আছে ry ট্রাইপার্স পদ্ধতি যা ছোঁড়ে না।
অ্যান্ডি

1
@ কোডার: এটি একেবারে আবর্জনা। কোডগুলির একটি স্তরে ব্যতিক্রমী জিনিসগুলি অন্যটিতে ব্যতিক্রমী নাও হতে পারে-অথবা আপনি চালিয়ে যাওয়ার আগে উদাহরণস্বরূপ উপস্থিত বা ত্রুটি বা ডিবাগ তথ্য যুক্ত করতে পারেন।
ডেড এমএমজি

উত্তর:


46

আপনি যে উদাহরণটি উদ্ধৃত করেছেন তা হ'ল এআইপি ডিজাইনের কারণে (কোনও স্ট্রিং পার্স করার চেষ্টা এবং ব্যতিক্রম ধরা ব্যতীত কোনও স্ট্রিং বৈধ পূর্ণসংখ্যা কিনা তা পরীক্ষা করার কোনও পরিষ্কার উপায় নেই)।

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

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


1
+1, ভাল পয়েন্ট তৈরি। আমি মনে করি যে কোনও ত্রুটি বার্তা প্রস্তুতকরণ এবং ত্রুটি লগিংয়ের মতো ক্যাচটিতে কিছু প্রক্রিয়াকরণ বৈধ হতে পারে। ব্যয়বহুল সংস্থান যেমন ডিবি সংযোগ এবং (। নেট) সিওএম রেফারেন্সগুলি মুক্ত করা শেষ অবধি যুক্ত হতে পারে।
NoChance

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

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

3
শেষ বাক্যটির জন্য +1
হতাশিত

2
@ স্কারফ্রিজ: আমি আপনার সাথে পুরোপুরি একমত আছি :) একটি বুলিয়ান-ফিরিয়ে দেওয়া ইন্টিজার (স্ট্রিং) পদ্ধতির অনুপস্থিতি হ'ল "দুর্বল এপিআই নকশা" দিয়েই বোঝানো হয়েছে
মাইকেল বর্গওয়ার্ট

9

এটি এমন একটি ভাষা যা ভাষা এবং দৃষ্টান্তের উপর নির্ভর করে।

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

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


2
ব্যতিক্রম সহ ওভারহেড উল্লেখ করার জন্য +1। আমি নেট করি এবং (কমপক্ষে আমার মেশিনে) আমি তখনও অনুভব করতে পারি যখন অন্যান্য স্বাভাবিক ক্রিয়াকলাপের তুলনায় কিছু ক্ষেত্রে সময় ব্যয় হওয়ার সময় ব্যতিক্রম হওয়ার কথা।
NoChance

2
@ এমদাদকারিম কেবলমাত্র আপনার যদি একটি ডিবাগার সংযুক্ত থাকে। আপনি ডিবাগার ছাড়াই তাদের প্রতি কয়েক হাজারে ফেলে দিতে পারেন।
কোডসইনচাউস

@ কোডইনচায়োস, আপনি ঠিক আছেন আমি কীভাবে জানতে পারি, আমি এমন একটি পরিষ্কার কোড লিখি যা রান সময়ে কখনই পায় না :)
NoChance

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

@ কোডইন চাওস, এটি জেনে রাখা ভাল। আমি আমার শেষ মন্তব্যে মজা করছি।
NoChance

9

এটি চেষ্টা / ধরা ব্লক সম্পর্কে চিন্তা করার সেরা উপায় নয়। চেষ্টা / ধরার ব্লকগুলি সম্পর্কে ভাবার উপায় এটি: একটি ব্যর্থতা ঘটেছে, যেখানে এই নির্দিষ্ট ব্যর্থতা মোকাবেলার সেরা জায়গা to এটি কোডের পরের লাইন হতে পারে, এটি কল শৃঙ্খলে বিশ স্তরের হতে পারে। যেখানেই হোক না কেন, সেখানেই হওয়া উচিত।

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

বোঝার জন্য গুরুত্বপূর্ণ অংশটি হ'ল: ক্যাচ ব্লক == আমি কীভাবে এটি মোকাবেলা করতে জানি।


6

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

ব্যতিক্রমগুলি সহ প্রবাহকে পরিচালনা করা ধীর এবং শব্দার্থগতভাবে ভুল।


4
আপনি কী বলছেন তা আমি জানি, তবে এটি লক্ষণীয় যে ব্যতিক্রমগুলি হ'ল প্রোগ্রাম প্রবাহকে হ্যান্ডেল করে - কেবল এটি ব্যতিক্রমী ত্রুটি প্রবাহ নিয়ন্ত্রণ করতে ব্যবহার করা উচিত ...
সর্বোচ্চ

ক্যাচ ব্লকে কখন যুক্তি লিখতে হবে এবং কখন হবে না সে সম্পর্কে কোনও নির্দিষ্ট নির্দেশিকা নেই?
হাশিমআর

4
জাভা এর নম্বর পার্সার এবং পাঠ্য বিন্যাসগুলি সমস্যাযুক্ত ব্যতিক্রমগুলির ব্যবহারের বিখ্যাত উদাহরণ: পূর্ব শর্তটি পরীক্ষা করার একমাত্র যুক্তিযুক্ত উপায় (যে স্ট্রিং পার্সেবল সংখ্যার প্রতিনিধিত্ব করে) তা পার্স করার চেষ্টা করা হয় এবং যদি এটি ব্যতিক্রম ব্যর্থ হয় তবে আপনার পছন্দগুলি কী প্রস্তুতিতে? আপনাকে ব্যতিক্রমটি ধরতে হবে এবং এর সাথে প্রবাহ পরিচালনা করতে হবে, এটিকে শব্দার্থগতভাবে ভুল বলে বিবেচনা করা উচিত।
জুনাস পুলক্কা

@JoonasPulakka আমি মনে করি wrt আপনার মন্তব্যকে নম্বর পারজার এবং টেক্সট formatters এই প্রশ্নের একটি পূর্ণ আকার উত্তর হিসেবে যোগ্যতা
মশা

5

যুক্তি লেখার জন্য হোল্ড প্রবাহ নিয়ন্ত্রণ ইত্যাদির জন্য ক্যাচ ব্লক ব্যবহার করা উচিত? নাকি কেবল ব্যতিক্রম ছোঁড়ার জন্য? এটি কোডের দক্ষতা বা রক্ষণাবেক্ষণকে প্রভাবিত করে?

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

শর্ত ছাড়াই যখন ক্রিয়াগুলি সাধারণ ক্রম অনুসরণ করে তখন কোডটি বোঝা সহজ। ব্যতিক্রমগুলি স্বাভাবিক প্রবাহ থেকে ত্রুটি পরীক্ষা করে অপসারণ করে রক্ষণাবেক্ষণের উন্নতি করে। মৃত্যুদন্ড কার্যকর সময়ের 99,9% বা সময়ের 50% বা সময়ের 20% সাধারণ প্রবাহ অনুসরণ করে তা বিবেচনা করে না।

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

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


1

কোড যুক্তি লেখার জন্য ক্যাচ ব্লক ব্যবহার করা উচিত নয়। এগুলি শুধুমাত্র ত্রুটিগুলি পরিচালনা করার জন্য ব্যবহার করা উচিত। একটি উদাহরণ হ'ল (১) যেকোন বরাদ্দ সম্পদ পরিষ্কার করুন, (২) একটি দরকারী বার্তা মুদ্রণ করুন এবং (৩) নিখুঁতভাবে প্রস্থান করুন।

এটি সত্য যে ব্যতিক্রমগুলি আপত্তিজনকভাবে gotoব্যবহার করা যেতে পারে এবং অনাকাঙ্ক্ষিত প্রভাবের কারণ হতে পারে । কিন্তু এটি তাদের অকেজো করে না। যখন সঠিকভাবে ব্যবহৃত হয় , তারা আপনার কোডের অনেকগুলি দিক উন্নতি করতে পারে।

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