সি ++ ব্যতিক্রম হ্যান্ডলিং রানটাইম কীভাবে প্রয়োগ করা হয়?


84

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

যেহেতু এটি সংকলক নির্দিষ্ট হতে পারে কেউ কি g ++ সংকলক স্যুটের প্রসঙ্গে এটি ব্যাখ্যা করতে পারে?


4
এই নিবন্ধটি পড়ুন আপনাকে সাহায্য করবে
আহমেদ

আমি জানি না - তবে আমি অনুমান করছি যে সি ++ স্পপের একটি পরিষ্কার সংজ্ঞা রয়েছে। (যদিও আমি ভুল হতে পারি)
পল নাথান

4
না, অনুমানটি কোনও সংজ্ঞা দেয় না। এটি আচরণের নির্দেশ দেয়, বাস্তবায়ন নয় not পল, আপনি কোন রূপায়ণে আগ্রহী তা উল্লেখ করতে পারেন
রব কেনেডি

4
সংশ্লিষ্ট প্রশ্ন: stackoverflow.com/questions/307610/...
CesarB

উত্তর:


49

প্রয়োগগুলি পৃথক হতে পারে তবে কিছু প্রাথমিক ধারণা রয়েছে যা প্রয়োজনীয়তা অনুসরণ করে।

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

প্রকৃত নিয়ন্ত্রণের স্থানান্তর হিসাবে, দুটি কৌশল বিদ্যমান। একটি হ'ল স্ট্যাকটি খুলে ফেলার জন্য পর্যাপ্ত তথ্য রেকর্ড করা। এটি মূলত চালানোর জন্য ধ্বংসকারীদের এবং ব্যতিক্রম হ্যান্ডলারদের তালিকা যা ব্যতিক্রমটি ধরে ফেলতে পারে। কোনও ব্যতিক্রম ঘটলে, কোনও ম্যাচিং ক্যাচ না পাওয়া পর্যন্ত এই ধ্বংসকারীদের কার্যকর করে স্ট্যাকটি চালিয়ে যান।

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


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

4
@ অ্যান্টন: হ্যাঁ, এটি ঠিকানা-সারণী পদ্ধতির ব্যবহার করে। বিশদটির জন্য আমার অন্য প্রশ্নের উত্তর দেখুন stackoverflow.com/questions/307610/… এ ।
সিজারব

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

@ স্পিডপ্লেন: না, এটি বোঝার অভাবের কারণে বেশি। ত্রুটি সামলানো কখনই বিনামূল্যে is সি কেবল আপনাকে এটি লিখতে বাধ্য করে। এবং আমরা সকলেই জানি যে কয়েকটি সি প্রোগ্রামগুলি খুব কম ব্যবহৃত কোড পাথে একটি free()বা একটি অনুপস্থিত fclose()
এমসাল্টারস 5:57

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

20

এটি 15.1 এ সংজ্ঞায়িত করা হয়েছে স্ট্যান্ডার্ডের ব্যতিক্রম ছুঁড়ে।

নিক্ষেপ একটি অস্থায়ী বস্তু তৈরি করে।
এই অস্থায়ী বস্তুর জন্য কীভাবে স্মৃতি বরাদ্দ করা হয় তা অনির্ধারিত।

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

ব্যতিক্রমটিকে পুনরায় নিক্ষেপ করা না হলে হ্যান্ডলার যেখানে ধরা হয়েছিল তার শেষে অস্থায়ীভাবে তা ধ্বংস হয়ে যায়।

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

এস। মিয়ার্সের কাছ থেকে পরামর্শ (কনফারেন্স অনুসারে ধরুন))

try
{
    // do stuff
}
catch(MyException const& x)
{
}
catch(std::exception const& x)
{
}

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

যতক্ষণ না বস্তুগুলি সৃষ্টির বিপরীত ক্রমে বিনষ্ট হয় আপনি প্রয়োগকারী প্রকৌশলী না হলে বাস্তবায়নের বিশদটি গুরুত্বপূর্ণ নয়।
মার্টিন ইয়র্ক

4
ভোট দিয়েছেন: ক) "স্কট মায়ার্স", "এস মাইয়ার্স" নয়; খ) অসত্য উদ্ধৃতি: "কার্যকর সি ++": "আইটেম 13: রেফারেন্স দিয়ে ব্যতিক্রমগুলি ধরুন " এটি ব্যতিক্রম অবজেক্টে টুইঙ্ক / তথ্য সংযোজনের অনুমতি দেবে।
সেবাস্তিয়ান মাচ

4
@ ফ্রেসনেল: আইটেম 21 ভুলবেন না: "যখনই সম্ভব সম্ভব কনট ব্যবহার করুন" Use একটি ব্যতিক্রম টুইটের জন্য ভাল কেস নেই। আপনার হওয়া উচিত ক) "ফিক্সিং এবং ডিসচার্ডিং", খ) পুনরায় নিক্ষেপ বা গ) নতুন ব্যতিক্রম উত্পন্ন করা।
মার্টিন ইয়র্ক

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

13

বিস্তারিত ব্যাখ্যার জন্য আপনি এখানে একবার দেখে নিতে পারেন ।

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


9

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে এখানে খুব ভাল এক্সপোজিশন রয়েছে, প্রতিটি জিসিসি এবং ভিসির প্রতিটি ক্ষেত্রেই ব্যবহৃত পদ্ধতিগুলি ব্যাখ্যা করে: http://www.hexblog.com/wp-content/uploads/2012/06/Recon- 2012-স্কোচিনস্কি-কম্পাইলার-ইন্টারনালস.পিডিএফ

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