আমি এটি সম্পর্কে ভেবেছিলাম এবং উদাহরণ দিয়ে আসতে পারিনি। কেউ কেন একটি ব্যতিক্রম ধরা এবং এটি সম্পর্কে কিছুই করতে চাইবে? আপনি কি একটি উদাহরণ দিতে পারেন? হয়তো এটি এমন কিছু যা কখনও করা উচিত নয়।
আমি এটি সম্পর্কে ভেবেছিলাম এবং উদাহরণ দিয়ে আসতে পারিনি। কেউ কেন একটি ব্যতিক্রম ধরা এবং এটি সম্পর্কে কিছুই করতে চাইবে? আপনি কি একটি উদাহরণ দিতে পারেন? হয়তো এটি এমন কিছু যা কখনও করা উচিত নয়।
উত্তর:
আমি ডি তে রূপান্তর ত্রুটির মতো জিনিসগুলি দিয়ে সর্বদা এটি করি:
import std.conv, std.stdio, std.exception;
void main(string[] args) {
enforce(args.length > 1, "Usage: foo.exe filename");
double[] nums;
// Process a text file with one number per line into an array of doubles,
// ignoring any malformed lines.
foreach(line; File(args[1]).byLine()) {
try {
nums ~= to!double(line);
} catch(ConvError) {
// Ignore malformed lines.
}
}
// Do stuff with nums.
}
এটি বলেছিল, আমি মনে করি যে সমস্ত ক্যাপ ব্লকগুলির মধ্যে কিছু থাকা উচিত , এমনকি যদি কিছু আপত্তি থাকে তবে কেন আপনি ব্যতিক্রম উপেক্ষা করছেন তা ব্যাখ্যা করে।
সম্পাদনা: আমি এটিতেও জোর দিতে চাই, আপনি যদি এই জাতীয় কিছু করতে চলেছেন তবে আপনি যে নির্দিষ্ট ব্যতিক্রমটি উপেক্ষা করতে চান কেবল সেটিকে ধরতে আপনার সাবধান হওয়া উচিত। পুরানো সরল catch {}
কাজ করা প্রায়শই একটি খারাপ কাজ।
একটি উদাহরণ যেখানে আমি মনে করি ঠিক আছে কিছু না করে ব্যতিক্রম গিলে ফেলা ঠিক নয়, এমনকি ব্যতিক্রম লগ করাও লগিং কোডের অভ্যন্তরে।
আপনি যদি কিছু লগ ইন করার চেষ্টা করে থাকেন এবং ব্যতিক্রম পেয়ে থাকেন তবে এটির বিষয়ে আপনি বেশি কিছু করতে পারবেন না:
এটি আপনাকে চুপচাপ এটিকে গ্রাস করার, "অ্যাপ্লিকেশনটির মূল কাজটি সম্পাদন করার অনুমতি দেয়, তবে এটির সমস্যা সমাধানের ক্ষমতা নিয়ে আপস করে" এর "সর্বনিম্নতম মন্দ" বিকল্পটি দেয়।
যদি কোনও ব্যতিক্রম কোনও অপারেশন দ্বারা ছুঁড়ে দেওয়া হয় যা যাইহোক alচ্ছিক ছিল, তখন করার মতো কিছুই হতে পারে না। এটি লগ করা দরকারী নাও হতে পারে। সেক্ষেত্রে আপনি হয়ত এটি ধরতে চান এবং কিছুই করতে পারেন না।
আপনি যদি এটি করছেন তবে একটি মন্তব্য অন্তর্ভুক্ত করুন। সবসময় যে কোনও বাগের মতো মনে হয় এমন মন্তব্য করুন (একটি switch
বিবৃতিতে পতিত হওয়া , খালি catch
ব্লক, শর্তে অ্যাসাইনমেন্ট)।
আপনি তর্ক করতে পারেন যে এটি ব্যতিক্রমগুলির যথাযথ ব্যবহার নয়, তবে এটি অন্য প্রশ্নের জন্য।
খালি catch
ব্লকগুলি বেশিরভাগ ভাষায় কোড গন্ধ। মূল ধারণাটি ব্যতিক্রমী পরিস্থিতিতে ব্যতিক্রমগুলি ব্যবহার করা এবং তাদের যৌক্তিক নিয়ন্ত্রণের জন্য ব্যবহার না করা। সমস্ত ব্যতিক্রম অবশ্যই কোথাও পরিচালনা করতে হবে।
এই পদ্ধতির গ্রহণের ফলস্বরূপ, আপনি যখন একটি নির্দিষ্ট অ্যাপ্লিকেশন স্তর প্রোগ্রাম করেন, আপনার বেশ কয়েকটি পছন্দ থাকে:
এটি সত্যিকার অর্থে কোনও কিছুই করার নেই, খালি catch
ব্লক রয়েছে।
সংযোজন সম্পাদনা : ধরুন আপনি এমন একটি ভাষায় প্রোগ্রামিং করছেন যেখানে ব্যতিক্রম ছোঁড়াটাই প্রোগ্রাম লজিক (বিকল্পগুলির মধ্যে একটি goto
) নিয়ন্ত্রণের স্বাভাবিক উপায় । তারপরে catch
এই ভাষায় লিখিত প্রোগ্রামে একটি খালি else
ব্লক অনেকটা aতিহ্যবাহী ভাষায় খালি ব্লকের মতো (বা কোনও else
ব্লক নয়)। তবে আমি বিশ্বাস করি এটি সি #, জাভা বা সি ++ উন্নয়ন সম্প্রদায়ের দ্বারা প্রস্তাবিত প্রোগ্রামিং স্টাইল নয়।
কিছু ক্ষেত্রে, জাভা আপনাকে এমন একটি ব্যতিক্রম পরিচালনা করতে হবে যা একেবারে কোনও পরিস্থিতিতে, কখনও ঘটতে পারে না। এই কোডটি বিবেচনা করুন:
try {
bytes[] hw = "Hello World".getBytes("UTF-8");
}
catch(UnsupportedCodingException e) {
}
জাভা প্ল্যাটফর্মের প্রতিটি প্রয়োগের জন্য নিম্নলিখিত মানক অক্ষরগুলি সমর্থন করা প্রয়োজন।
...
হল UTF-8
আপনার জাভা প্ল্যাটফর্মটি ভেঙে না ফেলে, কখনও কখনও এই ব্যতিক্রম ঘটানোর উপায় নেই। তাহলে কেন এটি সামলাতে বিরক্ত করবেন? তবে আপনি চেষ্টা-ধরার-ধারাটি কেবল বাদ দিতে পারবেন না।
throw new Error(e)
কেবলমাত্র কিছু মিস করিনি (বা আসলে ভাঙা প্ল্যাটফর্মের প্রতিবেদন করুন) তা নিশ্চিত হওয়ার জন্য যুক্ত করার প্ররোচিত করব।
একটি সাধারণ নিয়ম হিসাবে, না। আপনি হয় ব্যতিক্রমটিকে স্ট্যাকের উপরে ফেলে দিতে চান, বা যা হয়েছে তা লগ করুন।
যাইহোক, আমি প্রায়শই এটি করি যখন আমি স্ট্রিংগুলি পার্সিং করে সংখ্যায় রূপান্তর করি (বিশেষত ম্যাপিং প্রকল্পগুলিতে যা একবারে ব্যবহার হয় এবং বিভিন্ন ধরণের হয়)।
boolean isNonZeroNumber = false;
try {
if(StringUtils.isNotBlank(s) && new BigDecimal(s).compareTo(BigDecimal.ZERO) != 0) {
b = true;
}
} catch(NumberFormatException e) {
//swallow this exception; b stays false.
}
return b;
কিছু ক্ষেত্রে ব্যতিক্রম মোটেও ব্যতিক্রমী নয়; আসলে, এটি প্রত্যাশিত এই উদাহরণ বিবেচনা করুন:
/* Check if the process is still alive; exitValue() throws an exception if it is */
try {
p.exitValue();
processPool.remove(p);
}
catch (IllegalThreadStateException e) { /* expected behaviour */ }
যেহেতু জাভা.লং.প্রসেস () তে কোনও আইলাইভ () পদ্ধতি নেই তাই এটি এখনও বেঁচে আছে কিনা তা যাচাই করার একমাত্র উপায় হ'ল এক্সটিভালিউ () কল করা, যা প্রক্রিয়াটি এখনও চলমান থাকলে অবৈধ ট্র্যাডস্টেট এক্সেকশন নিক্ষেপ করে।
আমার নম্র অভিজ্ঞতায় খুব ভালই এই ভাল জিনিস হয়। আপনার মাইলেজ যদিও আলাদা হতে পারে।
প্রায়শই আমি যখনই এটি আমাদের কোড বেসে দেখেছি, এটি হয়েছে কারণ আমি খাওয়া ব্যতিক্রম লুকিয়ে থাকা একটি বাগ সন্ধান করেছি। অন্য কোনও উপায়ে বলতে গেলে, কোনও কোড সরবরাহ না করে, অ্যাপ্লিকেশনটির কোনও ত্রুটি চিহ্নিত করার বা অন্য ক্রিয়া সম্পাদনের কোনও উপায় নেই।
কখনও কখনও, উদাহরণস্বরূপ, এপিআই স্তরগুলিতে আপনি ব্যাতিক্রমগুলি অতীত হতে দিতে বা সক্ষম করতে নাও পারেন, সুতরাং সেই ক্ষেত্রে আমি সবচেয়ে জেনেরিক চেষ্টা করার চেষ্টা করি এবং তারপরে লগইন করি। আবারও, কমপক্ষে একটি ডিবাগ / ডায়াগনোশন সেশনের সুযোগ দেওয়ার জন্য।
সাধারণত, যদি এটি অবশ্যই খালি থাকে, তবে আমি কমপক্ষে কোনও প্রকারের একটি দৃ put়তা রেখেছি, তাই কোনও ডিবাগ সেশনের সময় কমপক্ষে কিছু ঘটে। এটি বলেছিল, আমি যদি এটি পরিচালনা করতে না পারি তবে আমি সেগুলি সম্পূর্ণরূপে বাদ দিতে চাই।
আইএমওর এমন এক জায়গা আছে যেখানে খালি ক্যাচ স্টেটমেন্ট ঠিক আছে। পরীক্ষার ক্ষেত্রে যেখানে আপনি ব্যতিক্রম প্রত্যাশা করেন:
try
{
DoSomething(); //This should throw exception if everything works well
Assert.Fail('Expected exception was not thrown');
}
catch(<whatever exception>)
{
//Expected to get here
}
আমি বিশ্বাস করি এমন কয়েকটি ক্ষেত্রে আছে যেখানে খালি ক্যাচ ক্লজ যুক্তিযুক্ত হওয়া জায়েজ - এগুলি তখনই যখন আপনি কোড চান যখন কোনও নির্দিষ্ট ক্রিয়াকলাপ ব্যর্থ হয় কেবল ঠিক চালিয়ে যেতে চান। তবে, আমি মনে করি যে এই প্যাটার্নটি সহজেই অতিরিক্ত ব্যবহার করা যেতে পারে, সুতরাং এটি ব্যবহারের আরও ভাল উপায় নেই কিনা তা নিশ্চিত করার জন্য প্রতিটি ব্যবহারের ঘনিষ্ঠভাবে পরীক্ষা করা উচিত। বিশেষত, প্রোগ্রামটি যদি কোনও অসঙ্গতিপূর্ণ অবস্থায় ছেড়ে যায় বা কোডটির অন্য কোনও অংশ পরে ব্যর্থ হতে পারে তবে এটি কখনই করা উচিত নয়।
কোনও ব্যতিক্রম ঘটলে আমি কিছুটা সতর্কতা না থাকাতে বিশ্বাস করি না - প্রোগ্রামিংয়ের একটি লক্ষ্য কোডের উন্নতি হওয়া উচিত না? যদি 10% সময় ব্যতিক্রম ঘটে এবং আপনি কখনই এটি সম্পর্কে জানেন না, তবে ব্যতিক্রমটি সর্বদা খারাপ বা আরও খারাপ হবে।
যাইহোক, আমি অন্য দিকটি দেখতে পাচ্ছি, যদি ব্যতিক্রম কোডের প্রক্রিয়াকরণে কোনও সত্যিকারের ক্ষতি না করে তবে ব্যবহারকারীকে কেন এটি প্রকাশ করুন। আমি যে সমাধানটি সাধারণত প্রয়োগ করি তা হ'ল এটি আমার লগার ক্লাস দ্বারা লগ করা হয় (এটি আমি যে কোনও একক শ্রেণীর মধ্যে কাজ করে যা লিখি)।
যদি এটি সৌম্য ব্যতিক্রম হয় তবে আমি আমার লগারের .Debug () পদ্ধতিতে কল করব; অন্যথায়, লগার.অরার () (এবং (সম্ভবত) নিক্ষেপ)
try
{
doWork();
}
catch(BenignException x)
{
_log.Debug("Error doing work: " + x.Message);
}
যাইহোক, আমার লগার প্রয়োগের ক্ষেত্রে, .Debug () পদ্ধতিতে কল করার পরে কেবলমাত্র এটিই লগ হবে যদি আমি আমার App.Config ফাইলটি নির্দিষ্ট করে যে প্রোগ্রামের প্রয়োগের লগ স্তরটি ডিবাগ মোডে রয়েছে।
অস্তিত্ব পরীক্ষা করা ভাল ব্যবহারের ক্ষেত্রে:
// If an exception happens, it doesn't matter. Log the initial value or the new value
function logId(person) {
let id = 'No ID';
try {
id = person.data.id;
} catch {}
console.log(id);
}
আর একটি মামলা হ'ল যখন একটি finally
ধারা ব্যবহার করা হয়:
function getter(obj){}
function objChecker()
{
try
{
/* Check argument length and constructor type */
if (getter.length === 1 && getter.constructor === Function)
{
console.log("Correct implementation");
return true;
}
else
{
console.log("Wrong implementation");
return false;
}
}
catch(e)
{
}
finally
{
console.log(JSON.stringify(getter))
}
}
// Test the override of the getter method
getter = getter;
objChecker();
getter = [];
objChecker();
getter = {};
objChecker();
getter = RegExp;
objChecker();
getter = Function;
objChecker();
ECMAScript এ ক্যাচ বাইন্ডিং কে বাদ দেওয়ার অনুমতি দেওয়ার প্রস্তাব রয়েছে যা এই এবং অনুরূপ ব্যবহারের ক্ষেত্রে সম্পর্কিত।
তথ্যসূত্র
কনসোল অ্যাপ্লিকেশনটির জন্য লগিং ক্লাসের সাথে এই জাতীয় কিছু করার জন্য কেবলমাত্র আমার প্রয়োজন হয়েছিল। একটি শীর্ষ-স্তরের গ্লোবাল ক্যাচ হ্যান্ডলার ছিল যা STDOUT এ ত্রুটিটি নির্গমন করেছিল, কোনও ফাইলটিতে ত্রুটিটি লগইন করেছে, তারপরে>> 0 টি ত্রুটি কোড সহ অ্যাপটি বন্ধ করে দিয়েছে।
এখানে সমস্যাটি ছিল যে কখনও কখনও, ফাইলটিতে লগিং ব্যর্থ হয়। ডিরেক্টরি অনুমতিগুলি আপনাকে ফাইলটি লিখতে বাধা দেয়, ফাইলটি কেবলমাত্র লক করা ছিল, যাই হোক না কেন। যদি এটি ঘটে থাকে তবে আমি অন্য কোথাও যেভাবে ছিলাম তেমনভাবে ব্যতিক্রমটি পরিচালনা করতে পারি না ( প্রাসঙ্গিক বিবরণগুলি লগ করুন , আরও ভাল ব্যতিক্রম প্রকারে আবদ্ধ করুন ইত্যাদি) কারণ ব্যতিক্রমের বিবরণ লগ করার ফলে লগার একই ক্রিয়াকলাপের মধ্য দিয়ে যায় ( কোনও ফাইলে লেখার চেষ্টা করছেন) যা ইতিমধ্যে ব্যর্থ হয়েছিল। যখন তারা আবার ব্যর্থ হয়েছে ... আপনি দেখতে পাবেন আমি কোথায় যাচ্ছি। এটি অসীম লুপে যায়।
যদি আপনি কিছু চেষ্টা}} ব্লকগুলি বাদ দেন তবে আপনি বার্তা বাক্সে উপস্থিত ব্যতিক্রমটি শেষ করতে পারেন (নীরব কনফিগার অ্যাপ্লিকেশনটির জন্য যা চান তা নয়)। সুতরাং যে পদ্ধতিতে লগ ফাইল লিখতে, আমার একটি খালি ক্যাচ হ্যান্ডলার আছে। আপনি তবুও 0 টি ত্রুটি কোড পান বলে এটি ত্রুটিটিকে সমাহিত করে না, এটি কেবল অসীম লুপটি থামিয়ে দেয় এবং অ্যাপটিকে সুদৃ .়ভাবে প্রস্থান করতে দেয়।
এটি খালি কেন তা ব্যাখ্যা করে অবশ্যই একটি মন্তব্য আছে।
(আমি এটি আগে পোস্ট করতে যাচ্ছিলাম, আমি কেবল বিস্মৃত হওয়ার ভয়ে ভীত ছিলাম। যেহেতু আমি একমাত্র নই, যদিও ...)
এটি পরিস্থিতিতে ঠিক আছে যখন বেশিরভাগ সমালোচনামূলক টুকরোটি শেষে থাকুক না কেন কিছু ক্রম অবশ্যই কার্যকর করা উচিত exec
উদাহরণ স্বরূপ. হোস্ট থেকে নিয়ন্ত্রকের গতি নিয়ন্ত্রণ যোগাযোগ। জরুরী পরিস্থিতিতে চলাচল বাতিল করতে, ট্র্যাজেক্টোরি জেনারেশন বন্ধ করতে, মোটরকে হ্রাস করতে, বিরতি সক্ষম করতে, অ্যামপ্লিফায়ারটি অক্ষম করতে এবং এর পরে আপনাকে অবশ্যই বাসের শক্তি মেরে ফেলার জন্য বেশ কয়েকটি প্রস্তুতিমূলক পদক্ষেপ রয়েছে। সবগুলি অবশ্যই ধারাবাহিকভাবে ঘটতে হবে এবং যদি কোনও পদক্ষেপের একটি ব্যর্থ হয় তবে অন্য ধাপগুলি কার্যকর করতে হবে এমনকি এমনকি হার্ডওয়্যার ক্ষতিকারক ঝুঁকির ঝুঁকির সাথেও। উপরের সবগুলি ব্যর্থ হলেও বলুন, কিল বাস পাওয়ারটি যাইহোক ঘটতে হবে।
ত্রুটি থেকে পুনরুদ্ধার করার জন্য সিস্টেমের সংস্থানগুলি গ্রেফতার করে বন্ধ করা
এই ক্ষেত্রে. আপনি যদি ব্যাকগ্রাউন্ডে এমন কোনও পরিষেবা চালাচ্ছেন যা ব্যবহারকারীর প্রতিক্রিয়া দেয় না, আপনি ব্যবহারকারীর কাছে ত্রুটির একটি ইঙ্গিত দিতে না চাইতে পারেন তবে আপনাকে প্রশংসাপূর্ণ পদ্ধতিতে ব্যবহার করা সংস্থানগুলি বন্ধ করতে হবে।
try
{
// execution code here
}
catch(Exception e)
{
// do nothing here
}
finally
{
// close db connection
// close file io resource
// close memory stream
// etc...
}
আদর্শভাবে, আপনি ত্রুটিগুলি ধরার জন্য ডিবাগ মোডে ক্যাচটি ব্যবহার করতে এবং এগুলি কনসোলে বা পরীক্ষার জন্য কোনও লগ ফাইলে মুদ্রণ করতে চান। উত্পাদনের পরিবেশে, ব্যাকগ্রাউন্ড পরিষেবাদি সাধারণত কোনও ত্রুটি নিক্ষেপ করার সময় ব্যবহারকারীকে বাধা দেয় না বলে আশা করা হয় যাতে ত্রুটির আউটপুট দমন করা উচিত।