আপনার সি ++ কোডে আপনি ব্যতিক্রমী সুরক্ষাটি কতটা গুরুত্বপূর্ণ বলে মনে করেন?


19

আমি যখনই আমার কোডটিকে দৃ exception়ভাবে ব্যতিক্রমী হিসাবে নিরাপদ করে বিবেচনা করি তখনও আমি এটি না করা সমর্থন করি কারণ এটি সময় ব্যয়কারী হবে। এই তুলনামূলক সহজ স্নিপেট বিবেচনা করুন:

Level::Entity* entity = new Level::Entity();
entity->id = GetNextId();
entity->AddComponent(new Component::Position(x, y));
entity->AddComponent(new Component::Movement());
entity->AddComponent(new Component::Render());
allEntities.push_back(entity); // std::vector
entityById[entity->id] = entity; // std::map
return entity;

একটি মৌলিক ব্যতিক্রম গ্যারান্টি কার্যকর করতে, আমি newকলগুলিতে একটি স্কোপ পয়েন্টার ব্যবহার করতে পারি । কলগুলির মধ্যে কোনও ব্যতিক্রম ছড়িয়ে দিলে এটি মেমরি ফাঁস রোধ করবে।

তবে, আসুন আমি বলি যে আমি একটি শক্ত ব্যতিক্রম গ্যারান্টিটি প্রয়োগ করতে চাই। অন্তত, আমি আমার পাত্রে জন্য একটি ভাগ পয়েন্টার (আমি বুস্ট ব্যবহার করছি না), একটি nothrow বাস্তবায়ন করতে হবে Entity::Swapatomically উপাদান যোগ করার জন্য, এবং atomically উভয় যোগ করার জন্য বাগ্ধারা কিছু বাছাই Vectorএবং Map। এগুলি বাস্তবায়নে কেবল সময় সাপেক্ষ হবে না, তবে ব্যয়বহুল হবে কারণ এটি ব্যতিক্রমী অনিরাপদ সমাধানের চেয়ে অনেক বেশি অনুলিপি জড়িত।

শেষ পর্যন্ত, এটি আমার কাছে মনে হয় that সময়টি সমস্ত কিছু করে ব্যয় করা কেবল ন্যায়সঙ্গত হবে না যাতে একটি সাধারণ CreateEntityকাজটি দৃ exception়ভাবে ব্যতিক্রম নিরাপদ। আমি সম্ভবত চাই যে গেমটি একটি ত্রুটি প্রদর্শন করবে এবং যেভাবেই হোক এই মুহুর্তে এটি বন্ধ হয়ে যাবে।

আপনি আপনার নিজের গেম প্রকল্পগুলিতে এটিকে কতদূর নিয়ে যান? কোনও ব্যতিক্রম যখন কেবল ক্র্যাশ করতে পারে এমন কোনও প্রোগ্রামের জন্য ব্যতিক্রম অনিরাপদ কোডটি লেখা কি সাধারণত গ্রহণযোগ্য?


21
আমি যখন অতীতে সি ++ প্রকল্পে কাজ করেছি, মূলত আমরা ভেবেছিলাম ব্যতিক্রমগুলি নেই।
টেট্রাড

2
আমি ব্যক্তিগতভাবে, ব্যতিক্রমগুলি ভালবাসি এবং প্রায়শই আমার কোডটি কীভাবে দৃ strong় গ্যারান্টি সরবরাহ করে তা কী করে তা নির্ণয় করতে উপভোগ করি। যদি আপনি কেবল ব্যতিক্রমী হয়ে ক্র্যাশ হয়ে যাচ্ছেন তবে যদিও ... এটি নিয়ে বিরক্ত করবেন না।

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

গোটোকনু কী বলেছিল, কোনও বাহ্যিক গ্রন্থাগার কোন ব্যতিক্রমগুলি ফেলতে পারে সে সম্পর্কে আপনাকে সচেতন হওয়া দরকার।
পিটার

উত্তর:


26

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

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

এটি বলার অপেক্ষা রাখে না যে আপনি যদি ব্যতিক্রমগুলি ব্যবহার করেন তবে সমস্ত কোড অবশ্যই দৃ exception় ব্যতিক্রমের গ্যারান্টি সরবরাহ করতে পারে - কেবল কোডের প্রতিটি টুকরোকে কোনও না কোনও সাজানোর গ্যারান্টি সরবরাহ করা উচিত (কোনওটিই মৌলিক নয়, শক্তিশালী) যাতে সেই কোডটি ব্যবহারের ক্ষেত্রে আপনি জানেন যে কোনটি আপনাকে গ্রাহক সরবরাহ করতে পারে tees সাধারণত নিম্ন স্তরের প্রশ্নের মধ্যে যে উপাদান রয়েছে তার গ্যারান্টিটি তত শক্ত stronger

আপনি যদি কখনও দৃ guarantee় গ্যারান্টি সরবরাহ করতে যাচ্ছেন না বা ব্যতিক্রম হ্যান্ডলিং দৃষ্টান্তগুলি এবং যা বোঝায় এমন সমস্ত অতিরিক্ত কাজ এবং অসুবিধাগুলি সত্যিই আলিঙ্গন না করে থাকেন তবে আপনি এর দ্বারা বোঝানো সমস্ত সুবিধাও পাবেন না এবং আপনার আরও সহজ হতে পারে পুরোপুরি ব্যাতিক্রমের জন্য সময়।


12
এটিই এক +1 এর মূল্য: "কোড যা ব্যতিক্রমগুলি ব্যবহার করে না এবং স্পষ্টভাবে ব্যতিক্রমী নয় সে কোডটি তাদের ব্যবহার করা কোডের চেয়ে ভাল তবে এটির ব্যতিক্রম সুরক্ষার আধিকারিক আশ্বাস" "
ম্যাক্সিমাস মিনিমাস

14

আমার সাধারণ নিয়মের থাম্ব: আপনার যদি ব্যতিক্রমগুলি ব্যবহার করতে হয় তবে ব্যতিক্রমগুলি ব্যবহার করুন। আপনার যদি ব্যতিক্রমগুলি ব্যবহার করার প্রয়োজন না হয় তবে ব্যতিক্রমগুলি ব্যবহার করবেন না। আপনার যদি ব্যতিক্রমগুলি ব্যবহার করার দরকার হয় বা না জানা থাকে তবে আপনার ব্যতিক্রমগুলি ব্যবহার করার দরকার নেই।

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

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


5

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

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

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

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

ফ্যালব্যাক শেডারও আছে। এটি একটি যা বেসিক ভার্টেক্স ম্যাট্রিক্স অপারেশন করে তবে যদি কোনও কারণে অভিন্ন ম্যাট্রিক্স না থাকে তবে এটি অर्थোগোনাল দৃষ্টিভঙ্গি করা উচিত। এটির যথাযথ শেডিং / আলো / উপকরণ নেই (যদিও এতে রঙ-ওভারাইড পতাকা রয়েছে যাতে আমি এটি আমার ত্রুটি জাল দিয়ে ব্যবহার করতে পারি)।

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

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


2

হারিয়ে যাওয়া রানটাইম চেক এবং ক্র্যাশগুলি সম্পর্কে বড় বিষয় হ্যাকারের প্রক্রিয়াটি গ্রহণ করার জন্য এবং সম্ভবত পরবর্তী সময়ে মেশিনটি ক্র্যাশ ব্যবহার করার সম্ভাবনা।

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

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

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

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

অ্যারের শেষের বাইরে লেখার মতো ব্যতিক্রমগুলি অবশ্যই অতিক্রম করে না এমন ত্রুটিগুলিতে মনোনিবেশ করুন। আপনার প্রোগ্রামটি কি সুযোগমতো তা করতে সক্ষম হবে না?


2

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

বিবেচনা করুন: যদি কিছু ব্যর্থ হয় এবং ব্যতিক্রম ছোঁড়ার প্রার্থী হতে পারে - তবে এর প্রভাব কী? এটা কতটা ব্যাপার? আপনি যদি কোনও গেমটিতে মেমরির বরাদ্দকে ব্যর্থ করেন (আপনার আসল উদাহরণটি ধরেন) আপনি ব্যর্থতার কেসটি কীভাবে পরিচালনা করবেন তার চেয়ে আপনার নিজের হাতে সাধারণত একটি বড় সমস্যা রয়েছে এবং ব্যতিক্রমের মাধ্যমে ব্যর্থতা কেস পরিচালনা করা বড় সমস্যা তৈরি করবে না won't চলে যাও. সবচেয়ে খারাপ - এটি আসলে বড় সমস্যাটি রয়েছে এমনটি লুকিয়ে রাখতে পারে। আপনি যে চান না? আমি জানি আমি না। আমি জানি যে আমি যদি কোনও মেমোরি বরাদ্দ ব্যর্থ করি তবে আমি ক্র্যাশ করতে এবং মারাত্মকভাবে পোড়াতে চাই এবং ব্যর্থতার পয়েন্টের যতটা সম্ভব তার কাছাকাছি করতে চাই, যাতে আমি ডিবাগারে ভেঙে পড়তে পারি, যা চলছে তা চিত্রিত করে সঠিকভাবে ঠিক করতে পারি।


1

এসই তে অন্য কারও উদ্ধৃতি দেওয়া যথাযথ কিনা তা নিশ্চিত নই তবে আমি মনে করি যে অন্য উত্তরগুলির কোনওটিরই সত্যিকার অর্থে এই বিষয়টি স্পর্শ করা হয়নি।

জেসন গ্রেগরির উদ্ধৃতি তাঁর গেম ইঞ্জিন আর্কিটেকচার বইটি থেকে । (দুর্দান্ত বই!)

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

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


2
স্ট্রাকচার্ড ব্যতিক্রম হ্যান্ডলিং একটি নির্দিষ্ট ধরণের ব্যতিক্রম হ্যান্ডলিং যা উইন্ডোজে পাওয়া যায় যা সাধারণত সি ++ ব্যতিক্রমের মতো নয়।
কাইলোটান

দোহ, আমি বিশ্বাস করতে পারি না আমি এটি জানতাম না। সংশোধনীর জন্য ধন্যবাদ!
ক্লাশনিকভকিড

0

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

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