Asserts হিসাবে বা ত্রুটি হিসাবে ব্যতিক্রম?


10

আমি একজন পেশাদার সি প্রোগ্রামার এবং শখের ওবজ-সি প্রোগ্রামার (ওএস এক্স)। খুব সমৃদ্ধ সিনট্যাক্সের কারণে সম্প্রতি আমি সি ++ এ প্রসারিত করতে প্রলুব্ধ হয়েছি।

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

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

সি ++ আরও ব্যতিক্রম ব্যতিক্রমগুলি বেশি পছন্দ করে seems উদাহরণস্বরূপ, RAII- র উইকিপিডিয়া উদাহরণটি যদি একটি ফাইল খুলতে না পারে তবে একটি ব্যতিক্রম ছুঁড়ে। উদ্দেশ্য-সি return nilআউট প্যারাম দ্বারা প্রেরিত ত্রুটি সহ with উল্লেখযোগ্যভাবে, এটি মনে হয় std :: ofstream যে কোনও উপায়ে সেট করা যায়।

এখানে প্রোগ্রামারগুলিতে আমি বেশ কয়েকটি উত্তর পেয়েছি হয় ত্রুটি কোডের পরিবর্তে ব্যতিক্রমগুলি ব্যবহার করার ঘোষণা দিচ্ছি বা ব্যতিক্রমগুলি মোটেও ব্যবহার না করে । প্রাক্তনটি আরও প্রচলিত বলে মনে হয়।

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

সম্পাদনা: যদিও পুরোপুরি প্রাসঙ্গিক না, তবে আমার সম্ভবত এটি কী nilতা পরিষ্কার করা উচিত । টেকনিক্যালি হিসাবে এটি একই NULL, কিন্তু কথা হলো, এটি একটি বার্তা পাঠাতে ঠিক আছে nil। সুতরাং আপনি যেমন কিছু করতে পারেন

NSError *err = nil;
id obj = [NSFileHandle fileHandleForReadingFromURL:myurl error:&err];

[obj retain];

এমনকি যদি প্রথম কলটি ফিরে আসে nil। এবং যেমন আপনি কখনই *objওজজে-সি-তে করেন না, কোনও এনইউএলএল পয়েন্টার অবলম্বনের ঝুঁকি নেই।


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

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

দেখে মনে হচ্ছে, সি ++ এর জন্য আপনার সেগুলি ব্যবহার না করার জন্য বরং ন্যায়সঙ্গত হওয়া প্রয়োজন । প্রতিক্রিয়া অনুযায়ী এখানে।
গাংনাস

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

"আমি পছন্দ করি না ... ব্যতিক্রমী নয় এমন জিনিসগুলির ব্যতিক্রম ব্যবহার করে" - সম্মত।
গাংনাস

উত্তর:


1

সি ++ আরও ব্যতিক্রম ব্যতিক্রমগুলি বেশি পছন্দ করে seems

আমি কিছু দিক থেকে অবজেক্টিভ-সি এর চেয়ে কম প্রস্তাব করব কারণ সি ++ স্ট্যান্ডার্ড লাইব্রেরি সাধারণত প্রোগ্রামার ত্রুটিগুলিকে সাধারণত সবচেয়ে সাধারণ কেস ডিজাইন ফর্মের মধ্যে এলোমেলো-অ্যাক্সেস সিকোয়েন্সের আউট-অফ-সীমা অ্যাক্সেসের মতো ফেলে দেয় না operator[]বা ( যেমন,) বা একটি অবৈধ পুনরাবৃত্তিকে ডিফেরেন্স করার চেষ্টা করছে। ভাষা সীমানার বাইরে কোনও অ্যারে অ্যাক্সেস করতে বা কোনও নাল পয়েন্টার বা এই ধরণের কিছুকে ডিফারেন্স করে on

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

সিটার এমনকি কোডিং স্ট্যান্ডার্ডগুলিতে এই জাতীয় ক্ষেত্রে ব্যতিক্রম এড়ানো এমনকি উত্সাহিত করে:

প্রোগ্রামিং ত্রুটির প্রতিবেদন করার ব্যতিক্রমটি ব্যবহার করার প্রাথমিক অসুবিধাটি হ'ল লাইনের অবস্থা অক্ষুণ্ন রেখে যেখানে লঙ্ঘনটি সনাক্ত করা হয়েছিল ঠিক সেই লাইনটিতে ডিবাগারটি চালু করতে চাইলে আপনি সত্যই অনাকাঙ্ক্ষিত স্ট্যাকটি ঘটতে চান না। সংক্ষেপে: এমন কিছু ত্রুটি রয়েছে যা আপনি জানেন যে ঘটতে পারে (আইটেমগুলি 69 থেকে 75 দেখুন)। অন্য সব কিছুর জন্য যা করা উচিত নয় এবং এটি প্রোগ্রামারের ত্রুটি যদি এটি করে তবে তা রয়েছে assert

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

বাহ্যিক ব্যতিক্রম

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

লেনদেন

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

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

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

কর্মক্ষমতা

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

এটি ত্রুটি-মুক্ত কার্যকরকরণের জন্য শূন্য রানটাইম ওভারহেড সরবরাহ করে, যা সি-রিটার্ন-ভ্যালু ত্রুটি পরিচালনা থেকেও ছাড়িয়ে যায় ses বাণিজ্য বন্ধ হিসাবে, একটি ব্যতিক্রমের প্রচারের একটি বিশাল ওভারহেড থাকে।

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

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

অ ত্রুটি

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

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

Set<int> set_intersection(const Set<int>& a, const Set<int>& b)
{
     Set<int> intersection;
     for (int key: a)
     {
          try
          {
              b.find(key);
              intersection.insert(other_key);
          }
          catch (const KeyNotFoundException&)
          {
              // Do nothing.
          }
     }
     return intersection;
}

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

এই ধরণের ক্ষেত্রে, ব্যর্থতার ইঙ্গিত দেয় এমন এক ধরণের রিটার্ন ভ্যালু (কোনও falseঅবৈধ পুনরাবৃত্তির কাছে প্রত্যাবর্তন nullptrবা যা কিছু প্রসঙ্গে বোঝায়) সাধারণত অনেক বেশি উপযুক্ত এবং অ-ত্রুটিযুক্ত প্রকারের কারণে প্রায়শই আরও ব্যবহারিক এবং উত্পাদনশীল কেস সাধারণত অ্যানালজিকাল catchসাইটে পৌঁছানোর জন্য কিছু স্ট্যাক আনওয়ানডিং প্রক্রিয়া কল করে না ।

প্রশ্নাবলি

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

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

যদি আপনাকে একেবারে কোনও কারণে ব্যতিক্রম এড়াতে হয় (উদাহরণস্বরূপ: আপনি যে মডিউলের সিআইপি রফতানি করেন তার সিআইপি সীমানা পেরিয়ে কাজ করছেন), অনেকেই আমার সাথে একমত হতে পারে না তবে আমি আসলে ওপেনএল-এর মতো একটি গ্লোবাল ত্রুটি হ্যান্ডলার / স্ট্যাটাস ব্যবহার করার পরামর্শ দিই glGetError()। প্রতিটি থ্রেডে অনন্য ত্রুটির স্থিতি পেতে আপনি এটিকে থ্রেড-লোকাল স্টোরেজ ব্যবহার করতে পারেন।

এর জন্য আমার যুক্তিটি হ'ল আমি উত্পাদন পরিবেশে দলগুলিকে সমস্ত সম্ভাব্য ত্রুটির জন্য পুঙ্খানুপুঙ্খভাবে চেক করতে অভ্যস্ত নই, দুর্ভাগ্যবশত, যখন ত্রুটি কোডগুলি ফিরে আসে। যদি সেগুলি পুরোপুরি হয় তবে কিছু সি সি এপিআই প্রতিটি সি সি এপি কল সম্পর্কে ত্রুটির মুখোমুখি হতে পারে এবং পুরোপুরি চেক করার জন্য এমন কিছুর প্রয়োজন হবে:

if ((err = ApiCall(...)) != success)
{
     // Handle error
}

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

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

আমার কাছে মনে হচ্ছে যেহেতু পয়েন্টারগুলি বিরল, তাই আমি যদি ব্যতিক্রমগুলি এড়াতে পছন্দ করি তবে অভ্যন্তরীণ ত্রুটিযুক্ত পতাকাগুলি নিয়ে আমার যেতে হবে।

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

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


14

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

যখন ব্যতিক্রমগুলি আসে তখন সি ++ অনেক আলগা হবার একটি কারণ হ'ল return nilযখনই আপনি এটির মতো মনে করেন ঠিক তেমন করতে পারেন না । nilবিরাট সংখ্যাগরিষ্ঠ এবং প্রকারভেদে এ জাতীয় কোনও জিনিস নেই ।

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

ব্যতিক্রমগুলি প্রতিটি ক্ষেত্রে ত্রুটি কোডের চেয়ে বিস্তৃত are আসল প্রশ্নটি ব্যতিক্রমী দাবিগুলির ব্যতিক্রম।

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

আমার মতে, ব্যতিক্রম ধরা আছে। অগত্যা অবিলম্বে নয়, শেষ পর্যন্ত। একটি ব্যতিক্রম হ'ল এমন একটি সমস্যা যা আপনি প্রত্যাশা করেন যে প্রোগ্রামটি কোনও এক সময় থেকে পুনরুদ্ধার করতে সক্ষম হবে। তবে প্রশ্নযুক্ত অপারেশন কোনও সমস্যা থেকে পুনরুদ্ধার করতে পারে না যা একটি ব্যতিক্রমের জন্য সতর্ক করে।

দৃ fail় ব্যর্থতা সর্বদা মারাত্মক, অপরিবর্তনযোগ্য ত্রুটি। স্মৃতি দুর্নীতি, এই ধরণের জিনিস।

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

পাদটীকা হিসাবে, আমি উল্লেখ করতে চাই যে কিছু "নাল অবজেক্ট প্যাটার্ন" জিনিসটি প্রায় কাছাকাছি চলছে। এই প্যাটার্নটি ভয়ানক । দশ বছরে এটি পরবর্তী সিঙ্গেলটন হবে। আপনি উপযুক্ত নাল বস্তু তৈরি করতে পারবেন এমন মামলার সংখ্যা হ'ল ক্ষুদ্র


বিকল্প অগত্যা একটি সহজ int নয়। আমি এনএসইরারের অনুরূপ কিছু ব্যবহার করবো যা আমি ওবজ-সি থেকে ব্যবহার করেছি।
জোহসন

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

অবজেক্টিভ-সি ব্যবহার করা যে কেউ অবশ্যই আপনাকে বলবে যে আপনি একেবারে, সম্পূর্ণ ভুল।
gnasher729

5

ব্যতিক্রমগুলি একটি কারণের জন্য উদ্ভাবিত হয়েছিল, এটি হ'ল আপনার সমস্ত কোডটি দেখতে এমন হওয়া এড়ানো উচিত:

bool success = function1(&result1, &err);
if (!success) {
    error_handler(err);
    return;
}

success = function2(&result2, &err);
if (!success) {
    error_handler(err);
    return;
}

পরিবর্তে, আপনি এমন কিছু পাবেন যা নীচের মতো দেখতে আরও একটি ব্যতিক্রম হ্যান্ডলারের সাথে mainবা অন্যথায় সুবিধাজনকভাবে অবস্থিত রয়েছে:

result1 = function1();
result2 = function2();

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

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


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

1

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

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

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

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

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


আমি আপনার সাথে একমত, তবে এ কারণেই সবচেয়ে বেশি মনে হচ্ছে না যে আমাকে প্রশ্ন জিজ্ঞাসা করেছিল।
প্রতি জোহানসন

0

ক্লিন কোডে একটি সুন্দর অধ্যায় রয়েছে যা এই বিষয় সম্পর্কে কথা বলে - অ্যাপল দৃষ্টিকোণকে বিয়োগ করে।

মূল ধারণাটি হ'ল আপনি নিজের ফাংশন থেকে কখনই শূন্য হন না, কারণ এটি:

  • প্রচুর নকল কোড যুক্ত করে
  • আপনার কোডটি গোলমাল করে তোলে - অর্থাত: এটি পড়া আরও শক্ত হয়ে যায়
  • প্রায়শই শূন্য-পয়েন্টার ত্রুটি হতে পারে - বা আপনার নির্দিষ্ট প্রোগ্রামিং "ধর্ম" এর উপর নির্ভর করে অ্যাক্সেস লঙ্ঘন করতে পারে

সাথে থাকা অন্যান্য ধারণাটি হ'ল আপনি ব্যতিক্রমগুলি ব্যবহার করেন কারণ এটি আপনার কোডের বিশৃঙ্খলাটিকে আরও কমাতে সহায়তা করে এবং ত্রুটি কোডের একটি সিরিজ তৈরি করা প্রয়োজন যা শেষ পর্যন্ত পরিচালনা এবং রক্ষণাবেক্ষণ করা (বিশেষত একাধিক মডিউল এবং প্ল্যাটফর্ম জুড়ে) ট্র্যাক করা কঠিন হয়ে পড়ে এবং আপনার গ্রাহকদের বোঝার জন্য ব্যথা, আপনি পরিবর্তে অর্থবহ বার্তাগুলি তৈরি করেন যা সমস্যার সঠিক প্রকৃতি চিহ্নিত করে, ডিবাগিংকে সহজতর করে তোলে এবং আপনার ত্রুটি পরিচালনার কোডটিকে একটি মৌলিক try..catchবিবৃতি হিসাবে সহজ কিছুতে হ্রাস করতে পারে ।

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


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