আপনি (সত্যই) ব্যতিক্রম নিরাপদ কোড লিখুন? [বন্ধ]


312

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

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

আমি EH এড়াতে চেষ্টা করি এবং কেবলমাত্র রিটার্ন মান, কলব্যাকস বা উদ্দেশ্য অনুসারে যাই হোক না কেন ব্যবহার করি। তবে যখন আপনাকে নির্ভরযোগ্য কোডটি লিখতে হবে, আপনি এই দিনগুলিতে কেবল এএইচটিকে উপেক্ষা করতে পারবেন না : এটি শুরু হয় new, যা কেবলমাত্র 0 (পুরানো দিনের মতো) ফিরে আসার পরিবর্তে একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে। সি ++ কোডের কোন লাইন সম্পর্কে এটা তৈরি করে প্রবন একটি ব্যতিক্রম হয়। এবং তারপরে সি ++ ভিত্তিক কোডে আরও স্থানগুলি ব্যতিক্রম ছুঁড়ে ফেলে ... স্টাড লিবিব এটি করে এবং আরও অনেক কিছু।

এটি নড়বড়ে ভিত্তিতে হাঁটার মতো অনুভব করে .. সুতরাং, এখন আমরা ব্যতিক্রমগুলি সম্পর্কে যত্ন নিতে বাধ্য হচ্ছি!

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

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

আমার আসল প্রশ্নগুলি:

  • আপনি কি সত্যিই ব্যতিক্রম নিরাপদ কোড লেখেন?
  • আপনি কি নিশ্চিত যে আপনার শেষ "উত্পাদন প্রস্তুত" কোডটি ব্যতিক্রম নিরাপদ?
  • আপনি কি নিশ্চিত হতে পারেন, এটি যে?
  • আপনি কি জানেন এবং / অথবা আসলে কাজ করে এমন বিকল্পগুলি ব্যবহার করেন?

44
"ইএইচ পুরানো পরিষ্কার নিয়ন্ত্রক পদ্ধতির প্রতিস্থাপন (রিটার্ন মান ..)" কি? ব্যতিক্রমগুলি রিটার্ন কোডগুলির মতোই নির্বিচারক are এগুলি সম্পর্কে এলোমেলো কিছু নেই।
rlbond

2
EH দীর্ঘ সময়ের জন্য আদর্শ (অ্যাডা এমনকি!)

12
"EH" ব্যতিক্রম পরিচালনার জন্য একটি প্রতিষ্ঠিত সংক্ষেপণ? আমি এর আগে কখনও দেখিনি।
টমাস প্যাড্রন-ম্যাকার্থি

3
নিউটনের আইনগুলি আজ বেশিরভাগ জিনিসের জন্য প্রযোজ্য। সত্য যে তারা বহু শতাব্দী ধরে বিস্তৃত ঘটনাগুলির পূর্বাভাস দিয়েছে তা তাৎপর্যপূর্ণ।
ডেভিড থর্নলি

4
@ ফ্রনসি: হেই, আপনাকে বিভ্রান্ত করার জন্য দুঃখিত! তবে আমি মনে করি যে, যদি কিছু হয় তবে একটি অদ্ভুত এবং অব্যক্ত সংক্ষিপ্ত বিবরণ বা সংক্ষিপ্ত বিবরণ মানুষকে না চেয়ে বেশি নিরুৎসাহিত করবে।
টমাস প্যাড্রন-ম্যাকার্থি

উত্তর:


520

আপনার প্রশ্নটি দৃ as়তার সাথে জানিয়েছে যে "ব্যতিক্রম-নিরাপদ কোড লেখা খুব শক্ত"। আমি প্রথমে আপনার প্রশ্নের উত্তর দেব, এবং তারপরে, তাদের পিছনে লুকানো প্রশ্নের উত্তর দেব।

প্রশ্নের উত্তর দিচ্ছি

আপনি কি সত্যিই ব্যতিক্রম নিরাপদ কোড লেখেন?

অবশ্যই আমি করবো.

এই কারণে জাভা একটি সি ++ প্রোগ্রামার (RAII শব্দার্থবিদ্যা অভাব) আমার তার আবেদন অনেক হারিয়ে গেছে, কিন্তু আমি digressing করছি: এটি একটি সি ++ প্রশ্ন।

এটি এসটিএল বা বুস্ট কোড সহ যখন আপনার কাজ করার দরকার হয় তখন এটি প্রয়োজনীয়। উদাহরণস্বরূপ, সি ++ থ্রেড ( boost::threadবা std::thread) করুণভাবে প্রস্থান করার জন্য একটি ব্যতিক্রম ছুঁড়ে ফেলবে।

আপনি কি নিশ্চিত যে আপনার শেষ "উত্পাদন প্রস্তুত" কোডটি ব্যতিক্রম নিরাপদ?

আপনি কি নিশ্চিত হতে পারেন, এটি যে?

ব্যতিক্রম-নিরাপদ কোড লেখা বাগ-ফ্রি কোড লেখার মতো।

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

আপনি কি জানেন এবং / অথবা আসলে কাজ করে এমন বিকল্পগুলি ব্যবহার করেন?

আছে কোন সি টেকসই বিকল্প ++, (অর্থাত আপনি সি এবং এড়ানোর সি ++ লাইব্রেরি, সেইসাথে উইন্ডোজ Seh মত বাহ্যিক চমকের ফিরে প্রত্যাবর্তন করতে হবে)।

ব্যতিক্রম নিরাপদ কোড লেখা

ব্যতিক্রম নিরাপদ কোড লিখতে, আপনাকে অবশ্যই প্রথমে জানতে হবে যে প্রতিটি নির্দেশ আপনি কী ব্যতিক্রম সুরক্ষা লিখেছেন of

উদাহরণস্বরূপ, একটি newব্যতিক্রম ছুঁড়ে ফেলতে পারে তবে একটি অন্তর্নির্মিত (যেমন কোনও আন্ত, বা পয়েন্টার) নির্ধারণ করা ব্যর্থ হবে না। একটি অদলবদল কখনই ব্যর্থ হবে না (কখনও কোনও ছোঁড়ার স্ব্যাপটি লিখবেন না), একটি std::list::push_backনিক্ষেপ করতে পারে ...

ব্যতিক্রম গ্যারান্টি

প্রথমটি বুঝতে হবে যে আপনাকে অবশ্যই আপনার সমস্ত কার্য দ্বারা প্রদত্ত ব্যতিক্রম গ্যারান্টিটি মূল্যায়ন করতে সক্ষম হতে হবে:

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

কোড উদাহরণ

নিম্নলিখিত কোডটি সঠিক সি ++ এর মতো বলে মনে হচ্ছে তবে সত্য, এটি "কিছুই নয়" গ্যারান্টি সরবরাহ করে এবং সুতরাং এটি সঠিক নয়:

void doSomething(T & t)
{
   if(std::numeric_limits<int>::max() > t.integer)  // 1.   nothrow/nofail
      t.integer += 1 ;                              // 1'.  nothrow/nofail
   X * x = new X() ;                // 2. basic : can throw with new and X constructor
   t.list.push_back(x) ;            // 3. strong : can throw
   x->doSomethingThatCanThrow() ;   // 4. basic : can throw
}

এই ধরণের বিশ্লেষণকে মাথায় রেখে আমি আমার সমস্ত কোড লিখি।

প্রদত্ত সর্বনিম্ন গ্যারান্টিটি বেসিক, তবে তারপরে, প্রতিটি নির্দেশের ক্রম পুরো ফাংশনটিকে "কিছুই না" করে তোলে, কারণ যদি 3 টি ছুড়ে, এক্স ফাঁস হয়ে যায়।

প্রথম কাজটি হ'ল ফাংশনটিকে "বেসিক" করা, এটি এক্সটিকে স্মার্ট পয়েন্টারে রেখে দিবে যতক্ষণ না এটি নিরাপদে তালিকার মালিকানাযুক্ত:

void doSomething(T & t)
{
   if(std::numeric_limits<int>::max() > t.integer)  // 1.   nothrow/nofail
      t.integer += 1 ;                              // 1'.  nothrow/nofail
   std::auto_ptr<X> x(new X()) ;    // 2.  basic : can throw with new and X constructor
   X * px = x.get() ;               // 2'. nothrow/nofail
   t.list.push_back(px) ;           // 3.  strong : can throw
   x.release() ;                    // 3'. nothrow/nofail
   px->doSomethingThatCanThrow() ;  // 4.  basic : can throw
}

এখন, আমাদের কোড একটি "বেসিক" গ্যারান্টি দেয়। কিছুই ফাঁস হবে না এবং সমস্ত বস্তু সঠিক অবস্থায় থাকবে। তবে আমরা আরও অফার করতে পারি, তা হ'ল দৃ guarantee় গ্যারান্টি। এই যেখানে এটি করতে ব্যয়বহুল হয়ে এবং কেন এই হল না সব সি ++ কোড শক্তিশালী। চল এটা চেষ্টা করি:

void doSomething(T & t)
{
   // we create "x"
   std::auto_ptr<X> x(new X()) ;    // 1. basic : can throw with new and X constructor
   X * px = x.get() ;               // 2. nothrow/nofail
   px->doSomethingThatCanThrow() ;  // 3. basic : can throw

   // we copy the original container to avoid changing it
   T t2(t) ;                        // 4. strong : can throw with T copy-constructor

   // we put "x" in the copied container
   t2.list.push_back(px) ;          // 5. strong : can throw
   x.release() ;                    // 6. nothrow/nofail
   if(std::numeric_limits<int>::max() > t2.integer)  // 7.   nothrow/nofail
      t2.integer += 1 ;                              // 7'.  nothrow/nofail

   // we swap both containers
   t.swap(t2) ;                     // 8. nothrow/nofail
}

আমরা প্রথমে ক্রিয়াকলাপটি অর্ডার করেছি, প্রথমে Xএটির সঠিক মান নির্ধারণ এবং সেট করা। যদি কোনও অপারেশন ব্যর্থ হয়, তবে tতা সংশোধিত হয় না, সুতরাং, অপারেশন 1 থেকে 3টিকে "শক্তিশালী" হিসাবে বিবেচনা করা যেতে পারে: যদি tকোনও কিছু ছোঁড়ে, সংশোধিত হয় না এবং Xফাঁস হয় না কারণ এটি স্মার্ট পয়েন্টারটির মালিকানাধীন।

এর পরে, আমরা একটি অনুলিপি তৈরি t2এর t7., এবং অপারেশন 4 থেকে এই কপি কাজ কিছু ছোঁড়ার পারেন, t2রুপান্তরিত করা হয়েছে, কিন্তু তারপর, tতারপরেও অরিজিনাল হয়। আমরা এখনও দৃ strong় গ্যারান্টি অফার।

তারপরে, আমরা অদলবদল tএবং t2। অদলবদল ক্রিয়াকলাপগুলি সি ++ তে নথ্র হওয়া উচিত, সুতরাং আসুন আশা করি আপনি Tযে স্বাপের জন্য লিখেছেন তা নোহ্রো (যদি তা না হয় তবে এটি পুনরায় লিখুন যাতে এটি নোরো হয়)।

সুতরাং, আমরা যদি ফাংশনটির শেষে পৌঁছে যাই, তবে সমস্ত কিছুই tসাফল্য পেয়েছে (রিটার্নের ধরণের দরকার নেই) এবং এর ব্যতীত মূল্য রয়েছে। যদি এটি ব্যর্থ হয় তবে tতার এখনও এর মূল মূল্য রয়েছে।

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

উপসংহার

ব্যতিক্রম-নিরাপদ কোড লিখতে কিছুটা অভ্যাস লাগে habit আপনি যে প্রতিটি নির্দেশনা ব্যবহার করবেন তার দ্বারা প্রদত্ত গ্যারান্টিটি মূল্যায়ন করতে হবে এবং তারপরে আপনাকে নির্দেশাবলীর তালিকা দ্বারা প্রদত্ত গ্যারান্টিটি মূল্যায়ন করতে হবে।

অবশ্যই, সি ++ সংকলক গ্যারান্টিটি ব্যাক আপ করবে না (আমার কোড অনুসারে, আমি গ্যারান্টিটি একটি @ ওয়ার্নিং ডোজিজেন ট্যাগ হিসাবে দিচ্ছি), যা অত্যন্ত দুঃখজনক, তবে এটি আপনাকে ব্যতিক্রম-নিরাপদ কোড লেখার চেষ্টা থেকে বিরত রাখা উচিত নয়।

সাধারণ ব্যর্থতা বনাম বাগ

কোনও প্রোগ্রামার কীভাবে গ্যারান্টি দিতে পারে যে কোনও ব্যর্থ ফাংশন সর্বদা সফল হবে? সর্বোপরি, ফাংশনে একটি বাগ থাকতে পারে।

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

ব্যতিক্রম ব্যতিক্রমী প্রক্রিয়াকরণ ব্যর্থতার জন্য, কোড বাগের জন্য নয়।

শেষ কথা

এখন, প্রশ্নটি "এটি কি এটি মূল্যবান?"

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

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

সুতরাং, যতদূর আমি এটা দেখতে হিসেবে, এটা হয় এটা মূল্য।

2010-01-29 সম্পাদনা করুন: নিক্ষেপ অদলবদল সম্পর্কে

নোবার একটি মন্তব্য করেছেন যে আমি বিশ্বাস করি, এটি যথেষ্ট প্রাসঙ্গিক, কারণ এটি "আপনি কীভাবে ব্যতিক্রম নিরাপদ কোড লিখবেন" এর অংশ:

  • [আমি] একটি অদলবদল কখনও ব্যর্থ হবে না (এমনকি একটি ছোঁড়া স্ব্যাপটি লিখবেন না)
  • [নোবার] এটি কাস্টম-লিখিত swap()ফাংশনগুলির জন্য একটি ভাল সুপারিশ । তবে এটি লক্ষ করা উচিত std::swap()যে এটি অভ্যন্তরীণভাবে ব্যবহৃত অপারেশনের ভিত্তিতে ব্যর্থ হতে পারে

ডিফল্টটি std::swapঅনুলিপি এবং অ্যাসাইনমেন্ট তৈরি করবে যা কিছু বস্তুর জন্য নিক্ষেপ করতে পারে। সুতরাং, ডিফল্ট অদলবদল নিক্ষেপ করতে পারে, হয় আপনার শ্রেণীর জন্য এমনকি এসটিএল ক্লাসের জন্যও ব্যবহৃত হয়। যতদুর C ++ -এর মান সংশ্লিষ্ট হয়, জন্য swap 'র অপারেশন vector, dequeএবং list, নিক্ষেপ করা হবে না যেহেতু এটি জন্য পারে mapযদি তুলনা functor কপি নির্মাণ (দেখুন উপর নিক্ষেপ করতে পারেন দ্য সি ++ ভাষা, বিশেষ সংস্করণ, পরিশিষ্ট E, E.4.3 প্রোগ্রামিং .স্বপ )।

ভেক্টরের অদলবদলটির ভিজ্যুয়াল সি ++ ২০০৮ বাস্তবায়নের দিকে তাকালে, ভেক্টরের অদলবদল দুটি ভেক্টরের একই বরাদ্দকারীর (যেমন, সাধারণ কেস) থাকে না তবে তারা পৃথকর বরাদ্দকারী থাকলে অনুলিপিগুলি তৈরি করবে। এবং এইভাবে, আমি ধরে নিচ্ছি যে এটি এই শেষ ক্ষেত্রে ফেলে দিতে পারে।

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

2011-11-06 সম্পাদনা করুন: আকর্ষণীয় নিবন্ধ

ডেভ আব্রাহামস , যিনি আমাদের বুনিয়াদি / শক্তিশালী / নোট্রো গ্যারান্টি দিয়েছেন , একটি নিবন্ধে এসটিএল ব্যতিক্রমকে নিরাপদ করার বিষয়ে তাঁর অভিজ্ঞতার বর্ণনা দিয়েছেন:

http://www.boost.org/community/exception_safety.html

7th ম পয়েন্টটি দেখুন (ব্যতিক্রম-সুরক্ষার জন্য অটোমেটেড টেস্টিং), যেখানে তিনি প্রতিটি কেস পরীক্ষা করা হচ্ছে না তা নিশ্চিত করতে স্বয়ংক্রিয় ইউনিট পরীক্ষার উপর নির্ভর করে। আমি অনুমান করি যে এই অংশটি প্রশ্ন লেখকের " আপনি কি এমনকি নিশ্চিত হতে পারেন যে এটি? " একটি দুর্দান্ত উত্তর ।

2013-05-31 সম্পাদনা করুন: দিয়ানোদার থেকে মন্তব্য

t.integer += 1;গ্যারান্টি ছাড়াই যে ওভারফ্লোটি ব্যতিক্রম নিরাপদ হবে না, এবং বাস্তবে প্রযুক্তিগতভাবে ইউবিকে ডাকতে পারে! (স্বাক্ষরিত ওভারফ্লো হ'ল ইউবি: সি ++ 11 5/4 "যদি কোনও অভিব্যক্তির মূল্যায়নের সময়, ফলাফলটি গাণিতিকভাবে সংজ্ঞায়িত না হয় বা তার ধরণের জন্য উপস্থাপনযোগ্য মানগুলির পরিসীমাতে না হয় তবে আচরণটি অপরিবর্তিত থাকে।") নোট করুন যে স্বাক্ষরিত পূর্ণসংখ্যা ওভারফ্লো হয় না, তবে তাদের গণনা সমতুল্য শ্রেণির 2 ^ # বিটগুলিতে করুন।

ডিওনাডার নিম্নলিখিত লাইনের উল্লেখ করছেন, যা প্রকৃতপক্ষে অপরিবর্তিত আচরণ করেছে has

   t.integer += 1 ;                 // 1. nothrow/nofail

এখানে সমাধানটি হল যাচাইয়ের আগে পূর্ণসংখ্যাটি ইতিমধ্যে তার সর্বাধিক মানটিতে (ব্যবহার করা std::numeric_limits<T>::max()) হয় কিনা তা যাচাই করা ।

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

আমি দিওনাদারের মন্তব্যে মাথায় রেখে কোডটি সংশোধন করেছি।


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

8
"একটি অদলবদল কখনও ব্যর্থ হবে না"। এটি কাস্টম-লিখিত অদলবদল () ফাংশনগুলির জন্য একটি ভাল সুপারিশ। তবে এটি লক্ষ করা উচিত যে std :: swap () অভ্যন্তরীণভাবে এটি যে অপারেশনগুলি ব্যবহার করে তার ভিত্তিতে ব্যর্থ হতে পারে।
nobar

7
@ মেহরদাদ:: "finally" does exactly what you were trying to achieveঅবশ্যই তা করে। যেহেতু এটা দিয়ে ভঙ্গুর কোড উত্পাদন করা সহজ finally, "চেষ্টা-সঙ্গে-সম্পদ" ধারণা করা হয় পরিশেষে জাভা 7 (যে, 10 বছর পর সি # 'গুলি চালু usingসি ++ destructors পর এবং 3 দশক)। আমি এই সমালোচনা সমালোচনা। হিসাবে হিসাবে Just because [finally] doesn't match your taste (RAII doesn't match mine, [...]) doesn't mean it's "failing": এতে, শিল্পটি আপনার রুচির সাথে একমত নয়, কারণ আবর্জনা সংগ্রহ করা ভাষাগুলি RAII- দ্বারা অনুপ্রাণিত বিবৃতিগুলি যুক্ত করে (C # 's usingএবং জাভা try)।
প্যারাসেবল

5
@ মেহরদাদ:: RAII doesn't match mine, since it needs a new struct every single darn time, which is tedious sometimesনা, তা হয় না। রিসোর্সগুলি "রক্ষা" করতে আপনি স্মার্ট পয়েন্টার বা ইউটিলিটি ক্লাস ব্যবহার করতে পারেন।
পেরেসারবল

5
@ মেহরদাদ: "এটি আপনাকে এমন কোনও কিছুর জন্য একটি র‌্যাপার তৈরি করতে বাধ্য করে" যার জন্য আপনার মোড়কের দরকার পড়ে না "- আরএআইআই ফ্যাশনে কোডিংয়ের সময় আপনার কোনও ধরণের র‌্যাপারের প্রয়োজন হবে না: রিসোর্সটি হ'ল অবজেক্ট এবং অবজেক্টস আজীবন রিসোর্স আজীবন। যাইহোক, আমি একটি সি ++ বিশ্ব থেকে এসেছি, আমি বর্তমানে একটি জাভা প্রকল্পের সাথে লড়াই করছি। সি ++ এ আরআইআইয়ের তুলনায় জাভাতে থাকা "ম্যানুয়াল রিসোর্স ম্যানেজমেন্ট" একটি মেস! আমার মতামত, তবে জাভা অনেক আগে "স্বয়ংক্রিয় সংস্থান এমজিএমটি" এর জন্য "স্বয়ংক্রিয় মেমরি এমজিএমটি" কেনাবেচা করেছিল।
ফ্রুনসী

32

সি ++ এ ব্যতিক্রম-নিরাপদ কোড লেখার জন্য প্রচুর চেষ্টা}} ক্যাচ {} ব্লক ব্যবহার করার মতো নয়। এটি আপনার কোড কী ধরণের গ্যারান্টি সরবরাহ করে তা নথিভুক্ত করার বিষয়ে।

আমি হার্ব সটারের গুরু অফ দ্য উইক সিরিজটি পড়ার পরামর্শ দিচ্ছি , বিশেষ কিস্তিতে 59, 60 এবং 61।

সংক্ষিপ্তসার হিসাবে, ব্যতিক্রমী সুরক্ষার তিনটি স্তর আপনি প্রদান করতে পারেন:

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

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


1
তাঁর "ব্যতিক্রমী সি ++" বইটিও বেশ ভাল পঠিত। তবে আমি এখনও ইএইচ ধারণাটি নিয়ে প্রশ্ন করার চেষ্টা করি ...
ফ্রুনসী

8
+1 ওপি ব্যতিক্রমগুলি হ্যান্ডলিংয়ের ব্যতিক্রমগুলি (তাদের ধরতে) ব্যতিক্রমের সুরক্ষার সাথে (সাধারণত আরএআইআই সম্পর্কে আরও বেশি) কনফ্লেট করে
জে কে।

আমি সন্দেহ করি যে খুব কম উত্পাদন সি ++ কোড ব্যতিক্রম নিরাপদ।
রায়েডওয়াল্ড

18

আমাদের মধ্যে কেউ কেউ 20 বছরেরও বেশি সময় ধরে ব্যতিক্রম ব্যবহার করে আসছে। পিএল / আমি তাদের আছে, উদাহরণস্বরূপ। তারা একটি নতুন এবং বিপজ্জনক প্রযুক্তি যে ভিত্তি আমার কাছে সন্দেহজনক বলে মনে হয়।


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

1
আপনি যদি এটি পছন্দ না করেন তবে এটি ব্যবহার করবেন না। যে কলগুলি আপনাকে কল করতে হবে তার চারপাশে ব্লকগুলি চেষ্টা করুন এবং ই-পুরাতন-ত্রুটি-কোডটি পুনরায় উদ্ভাবন করতে পারেন এবং এতে যে সমস্যা রয়েছে তা সহ্য করতে পারেন যা কিছু ক্ষেত্রে সহনীয়।
bmargulies

ঠিক আছে, নিখুঁত, আমি কেবল EH এবং ত্রুটি-কোডগুলি ব্যবহার করব এবং এটির সাথে বেঁচে থাকব। আমি নিতউইট, আমার নিজেরাই সমাধান হওয়া উচিত ছিল! ;)
ফ্রুনসী

17

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

এখন আপনার আসল প্রশ্নের জন্য।

আপনি কি সত্যিই ব্যতিক্রম নিরাপদ কোড লেখেন?

হ্যাঁ. আমি সব ক্ষেত্রে ব্যতিক্রম নিরাপদ কোডের জন্য চেষ্টা করি। আমি সংস্থানগুলিতে স্কোপড অ্যাক্সেসের জন্য RAII কৌশলগুলি ব্যবহার করে সুসমাচার প্রচার করি (উদাহরণস্বরূপ, boost::shared_ptrমেমরির boost::lock_guardজন্য, লকিংয়ের জন্য)। সাধারণভাবে, আরআইআইআই এবং স্কোপ গার্ডিং কৌশলগুলির ধারাবাহিক ব্যবহার ব্যতিক্রমী নিরাপদ কোডটি লিখতে অনেক সহজ করে দেবে। কৌশলটি কী তা বিদ্যমান তা কীভাবে প্রয়োগ করতে হবে তা শিখতে হবে।

আপনি কি নিশ্চিত যে আপনার শেষ "উত্পাদন প্রস্তুত" কোডটি ব্যতিক্রম নিরাপদ?

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

আপনি কি নিশ্চিত যে এটি যে হতে পারে?

হ্যাঁ. আপনি একটি পুঙ্খানুপুঙ্খ কোড অডিট দ্বারা নিশ্চিত হতে পারেন তবে কেউ সত্যিই তা করে না? নিয়মিত কোড পর্যালোচনা এবং সাবধানী বিকাশকারীরা যদিও সেখানে পৌঁছাতে দীর্ঘ পথ পাড়ি দেয়।

আপনি কি জানেন এবং / অথবা আসলে কাজ করে এমন বিকল্পগুলি ব্যবহার করেন?

আমি কয়েক বছর ধরে কয়েকটি পরিবর্তন চেষ্টা করেছি যেমন উপরের বিটগুলিতে এনকোডিং রাজ্যগুলি (আলা HRESULTএস ) বা সেই ভয়ঙ্কর setjmp() ... longjmp()হ্যাক। উভয়ই সম্পূর্ণ ভিন্ন উপায়ে যদিও অনুশীলনে ভেঙে যায়।


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

  • আপনি কেবল যখন দেখতে চান try/ catchযখন আপনি একটি নির্দিষ্ট ব্যতিক্রম সম্পর্কে কিছু করতে পারেন
  • আপনি প্রায় কোনও কাঁচা newবা deleteকোড দেখতে চান না
  • পরিহার std::sprintf, snprintfএবং সাধারণভাবে অ্যারে - ব্যবহারের std::ostringstreamসঙ্গে বিন্যাস এবং অ্যারে প্রতিস্থাপন জন্য std::vectorএবংstd::string
  • সন্দেহ হলে, নিজের ঘূর্ণায়মান হওয়ার আগে বুস্ট বা এসটিএলে কার্যকারিতা সন্ধান করুন

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


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

"আপনি প্রায়শই কোনও কাঁচা newবা deleteকোড দেখতে চান না ": কাঁচা দ্বারা আমি অনুমান করি আপনি কোনও নির্মাতা বা ডেস্ট্রাক্টরের বাইরে বোঝাতে চাইছেন।
রায়েডওয়াল্ড

@ রেয়েডওয়াল্ড - পুনরায়: উপাচার্য ++: এসইএইচ ব্যতিক্রম ছুঁড়ে ফেলা হলে ভিসি ++ এর ভিসি ২০০৫ সংস্করণ স্থানীয় বিষয়গুলি ধ্বংস করবে না। পড়ুন "সি সক্ষম ++, ব্যতিক্রম হ্যান্ডলিং" । ভিএস ২০০৫-এ, এসইএইচ ব্যতিক্রম ডিফল্টরূপে সি ++ অবজেক্টের ডেস্ট্রাক্টরকে কল করে না। আপনি যদি উইন 32 ফাংশন বা কোনও সি-ইন্টারফেস ডিএলএলে সংজ্ঞায়িত কোনও কিছু কল করেন, তবে আপনাকে এই সম্পর্কে চিন্তিত হতে হবে যেহেতু তারা কোনও এসইএইচ ব্যতিক্রম আপনার পথে ফেলে দিতে পারে।
ডি.শ্যাওলি

@ রেয়েডওয়াল্ড: পুনরায়: কাঁচা : মূলতঃ deleteএর প্রয়োগের মতো tr1::shared_ptrএবং এর বাইরে কখনও ব্যবহার করা উচিত নয় । newএর ব্যবহার যেমন কিছু হয় তেমন ব্যবহার করা যেতে পারে tr1::shared_ptr<X> ptr(new X(arg, arg));। গুরুত্বপূর্ণ অংশটি হ'ল ফলাফলটি newসরাসরি পরিচালিত পয়েন্টারে যায়। পৃষ্ঠার boost::shared_ptrসর্বোত্তম কার্যাভ্যাস সেরা বর্ণনা করা হয়েছে।
ডি.শ্যাওলি

আপনি ব্যতিক্রম সুরক্ষার জন্য আপনার বিধিগুলির সেটগুলিতে কেন স্ট্যান্ড :: স্প্রিন্টফ (এট আল) উল্লেখ করেন? এগুলি কোনও ব্যতিক্রম নথি হিসাবে নথিভুক্ত করে না, যেমন en.cppreferences.com/w/cpp/io/c/fprintf
mabraham

10

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

অন্য কথায়, ব্যতিক্রমী-নিরাপদ কোড তৈরি করা একটি বড় ডিগ্রি কেবল প্রোগ্রাম ডিজাইনের বিষয় যা কেবল প্লেড কোডিংয়ের বিষয় নয় ।


8
  • আপনি কি সত্যিই ব্যতিক্রম নিরাপদ কোড লেখেন?

ঠিক আছে, আমি অবশ্যই করতে চাই।

  • আপনি কি নিশ্চিত যে আপনার শেষ "উত্পাদন প্রস্তুত" কোডটি ব্যতিক্রম নিরাপদ?

আমি নিশ্চিত যে আমার 24/7 সার্ভারগুলি ব্যতিক্রমগুলি ব্যবহার করে নির্মিত 24/7 চালায় এবং মেমরি ফাঁস করবেন না।

  • আপনি কি নিশ্চিত হতে পারেন, এটি যে?

কোনও কোড সঠিক কিনা তা নিশ্চিত হওয়া খুব কঠিন। সাধারণত, কেউ কেবল ফলাফল দিয়ে যেতে পারে

  • আপনি কি জানেন এবং / অথবা আসলে কাজ করে এমন বিকল্পগুলি ব্যবহার করেন?

না। ব্যতিক্রমগুলি ব্যবহার করা প্রোগ্রামিংয়ের ক্ষেত্রে আমি গত 30 বছরেরও বেশি সময় ধরে ব্যবহার করেছি এমন বিকল্পগুলির চেয়ে পরিষ্কার এবং সহজ।


30
এই উত্তরের কোনও মূল্য নেই।
ম্যাট জয়েনার

6
@ ম্যাটজয়াইনার তাহলে প্রশ্নের কোনও মূল্য নেই has
মাইলস রাউথ

5

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

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


3

EH সাধারণত ভাল। তবে সি ++ এর বাস্তবায়ন খুব বন্ধুত্বপূর্ণ নয় কারণ আপনার ব্যতিক্রম কভারেজ ক্যাপচার কতটা ভাল তা বলা শক্ত really উদাহরণস্বরূপ জাভা এটিকে সহজ করে তোলে, আপনি যদি সম্ভাব্য ব্যতিক্রমগুলি পরিচালনা না করেন তবে সংকলকটি ব্যর্থ হবে।


2
এটি ন্যায়বিচারের ব্যবহারের সাথে আরও ভাল noexcept
einpoklum

2

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

এছাড়াও, আইডিই সরঞ্জামগুলির সাহায্যে এটি চেষ্টা / ক্যাচ ব্লক বা অন্য কোনও ক্যাচ ব্লকটি স্বয়ংক্রিয়ভাবে যুক্ত করে।


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

2

আমাদের মধ্যে কিছু জাভা এর মতো ভাষা পছন্দ করে যা সি ++ এবং সি # এর মতো অদৃশ্য করার পরিবর্তে পদ্ধতিগুলির দ্বারা নিক্ষিপ্ত সমস্ত ব্যতিক্রমগুলি ঘোষণা করতে আমাদের বাধ্য করে।

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

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

এটি আমার অভিজ্ঞতা হয়েছে যে সি ++ এ পরিষ্কার ব্যতিক্রম হ্যান্ডলিং কোডটি লেখা মুশকিল। আমি new(nothrow)অনেক ব্যবহার করে শেষ ।


4
এবং আপনি বেশিরভাগ স্ট্যান্ডার্ড লাইব্রেরি এড়িয়ে চলেছেন? ব্যবহার new(std::nothrow)করা যথেষ্ট নয়। উপায় দ্বারা, এটি জাভা চেয়ে সি লেখার ব্যতিক্রম-নিরাপদ কোড ++, সহজ: en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
avakar

3
জাভা চেক করা ব্যতিক্রমের ব্যবহারযোগ্যতা অত্যন্ত বর্ধমান। আসলে জাভা ভাষা নয়, এগুলিকে সাফল্য হিসাবে বিবেচনা করা হয় না। এই কারণেই সি ++ এ "নিক্ষেপ" বিবৃতিটি এখন অপ্রচলিত হিসাবে বিবেচিত হয় এবং সি # কখনও এগুলি বাস্তবায়নের জন্য গুরুত্ব সহকারে বিবেচনা করে না (এটি একটি নকশার পছন্দ ছিল)। জাভা-র জন্য, নিম্নলিখিত নথিটি আলোকিত হতে পারে: googletesting.blogspot.com/2009/09/…
প্যারাসেবল

2
এটি আমার অভিজ্ঞতা যে সি ++ তে ব্যতিক্রম-নিরাপদ কোড লেখা এতটা কঠিন নয় এবং এটি সাধারণভাবে ক্লিনার কোডের দিকে নিয়ে যায়। অবশ্যই, আপনাকে এটি করতে শিখতে হবে।
ডেভিড থর্নলি

2

হ্যাঁ, ব্যতিক্রম-নিরাপদ কোড লেখার জন্য আমি আমার প্রিয়তম চেষ্টা করছি try

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

এই অপারেশনটি কি শক্তিশালী ব্যতিক্রম গ্যারান্টি সরবরাহ করতে লেখা যেতে পারে? আমি কি বেসিক জন্য নিষ্পত্তি করতে হবে? কোন রেখাগুলি ব্যতিক্রম ছুঁড়ে ফেলতে পারে এবং আমি কীভাবে তা নিশ্চিত করতে পারি যে তারা যদি তা করে তবে তারা বস্তুকে দূষিত করবে না?


2
  • আপনি কি সত্যিই ব্যতিক্রম নিরাপদ কোড লেখেন? [এখানে এমন কোন জিনিস নেই. আপনার পরিচালিত পরিবেশ না থাকলে ব্যতিক্রমগুলি ত্রুটিগুলির জন্য একটি কাগজের ঝাল। এটি প্রথম তিনটি প্রশ্নের ক্ষেত্রে প্রযোজ্য]]

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


0

লোকেরা অনেক কিছুই (আমি এমনকি বলব)।

ব্যতিক্রম সম্পর্কে সত্যই গুরুত্বপূর্ণ, এটি হ'ল কোনও হ্যান্ডলিং কোড না লিখলে - ফলাফলটি পুরোপুরি নিরাপদ এবং ভাল আচরণ করে। আতঙ্কিত করতে খুব আগ্রহী, তবে নিরাপদ।

অনিরাপদ কিছু পাওয়ার জন্য আপনাকে হ্যান্ডলারে সক্রিয়ভাবে ভুল করা দরকার এবং কেবল ধরা (...) catch error ত্রুটি কোড উপেক্ষা করার সাথে তুলনা করবে।


4
সত্য না. কোড লেখা খুব সহজ যেটি ব্যতিক্রম-নিরাপদ নয়। উদাহরণস্বরূপ: f = new foo(); f->doSomething(); delete f;যদি ডোসোমিংথ পদ্ধতিটি একটি ব্যতিক্রম ছুঁড়ে ফেলে তবে আপনার মেমরি ফাঁস হয়।
ক্রিস্টোফার জনসন

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

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

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

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