রেফারেন্স-টু-কনস্টের হিসাবে ব্যতিক্রম কেন ধরা?


84

আমি অনেকবার শুনেছি এবং পড়েছি যে রেফারেন্সের চেয়ে রেফারেন্স-টু-কনস্টের হিসাবে ব্যতিক্রম ধরা ভাল। কেন:

try {
    // stuff
} catch (const std::exception& e) {
    // stuff
}

এর চেয়ে ভাল:

try {
    // stuff
} catch (std::exception& e) {
    // stuff
}

উত্তর:


67

তোমার দরকার:

  • একটি রেফারেন্স যাতে আপনি বহিরাগতভাবে ব্যতিক্রমটি অ্যাক্সেস করতে পারেন
  • পারফরম্যান্স বাড়ানোর জন্য একটি কনস্ট্যান্ড, এবং সংকলকটি বলুন যে আপনি অবজেক্টটি সংশোধন করতে যাচ্ছেন না

আধুনিক নয় যতটা সাবেক কিন্তু const ড্রপ সংকেত আপনি ব্যতিক্রম (সাধারণত দরকারী শুধুমাত্র আপনি একটি উচ্চ স্তরের মধ্যে যোগ প্রসঙ্গকে এটা rethrow চান) পরিবর্তন করতে চান হবে শুধুমাত্র আসল কারণ গুরুত্বপূর্ণ ।


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

4
'বহিরাগতভাবে ব্যতিক্রম অ্যাক্সেস' বলতে কী বোঝ?
আম

4
@mango সম্ভবতঃ এটা (যেমন একটি ভার্চুয়াল ফাংশন কল করতে পারবেন থাকা মানে std::exceptionএর what()ফাংশন)। আপনি যদি মান অনুসারে ধরেন তবে আপনি সেই ফাংশনটিতে কল করতে পারবেন না এবং আসল ব্যতিক্রমের বিশদটি পেতে পারেন না।
এমএম

11
অ্যাপল ক্ল্যাং 7 এবং গিসি 5 দ্বারা উত্পাদিত অ্যাসেমবিলিটি দেখে (অপ্টিমাইজেশন ও 3 সহ) এবং আমি কনস্ট রেফ এবং নন-কনস্টের রেফ সমাবেশের মধ্যে কোনও পার্থক্য দেখতে পাচ্ছি না। সুতরাং, আমি অনুমান করি যে সিসি এবং অ্যাপল ঝনঝন সম্পর্কে অপ্টিমাইজেশনের মধ্যে কোনও পার্থক্য নেই
ভ্যাসিলি সোশনিকভ

4
সংকলক সহজেই দেখতে পাবে যে আপনি কোন বিষয়গুলি সংশোধন করেছেন এবং কোনটি নয় ( এসএসএ এবং ধ্রুবক প্রচার)। এর চেয়ে আরও ভাল ব্যাখ্যার প্রয়োজন (বা এটি কোনও মিথ?)।
rustyx

31

মূলত এর কোনও কারণ নেই।

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

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

যাইহোক, এটি পড়ার সময় এটি আপনাকে উষ্ণ এবং স্বাচ্ছন্দ্য বোধ করতে পারে - এটি আমার পক্ষে এটিই!

তাদের নিজস্ব, বিশেষ, থ্রেড-লোকাল স্ট্যাক রয়েছে।
দাবি পরিত্যাগী: Boost.Exception অর্ডার ভীতু কাপড় এবং ব্যতিক্রম বিবরণ, পোস্ট-নির্মাণ যোগ করতে এই বিরতি। তবে এটি হ্যাকারি!


আপনি দয়া করে বিস্তারিত বলতে পারেন Exception objects live in their own memory space? এটি সম্পর্কে পরামর্শ দেওয়ার জন্য আপনার কি ভাল পড়া আছে?
রিচার্ড ডালি

@ লেফ্লু: আমি আপনাকে স্ট্যান্ডার্ডের দিকে ইঙ্গিত করতে পারি, তবে "একটি ভাল পড়া" বলে মনে করা কিছুটা বিভ্রান্তিকর হতে হবে ...: পি
অরবিটে

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

@ লেফ্লু: আচ্ছা, এটি স্ট্যান্ডার্ডের চেয়ে বেশি অনুমোদনযোগ্য আর কিছু পায় না ....
অরবিটে

4
@ রিচার্ডডালি সি ++ প্রাইমার 5 তম , 18.1.1 এক্সপিপশন অবজেক্টটি পরীক্ষা করুন । এটি বলেছে যে ব্যতিক্রম বস্তুটি মহাকাশে অবস্থান করে, সংকলক দ্বারা পরিচালিত, যা ধরা পড়বে তাতে যা কিছু প্রবেশযোগ্য তা নিশ্চিত হওয়া যায় ed ব্যতিক্রম সম্পূর্ণরূপে পরিচালনা করার পরে ব্যতিক্রম বস্তুটি ধ্বংস হয়ে যায়।
রিক

5

এটি সংকলককে বলে যে আপনি কোনও ফাংশন কল করবেন না যা ব্যতিক্রম সংশোধন করে যা কোডটি অনুকূলিত করতে সহায়তা করতে পারে। সম্ভবত খুব একটা পার্থক্য তৈরি করে না, তবে এটি করার জন্য ব্যয়ও খুব কম।


2

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

ব্যতিক্রম হ্যান্ডলারগুলি, প্ল্যাটফর্ম নির্দিষ্ট হতে পারে এবং মজার জায়গাগুলিতে ব্যতিক্রম ঘটতে পারে কারণ তারা তাদের পরিবর্তনের আশা করে না?


-1

একই কারণে আপনি কনস্ট ব্যবহার করেন।


এবং একই কারণে কেন পয়েন্টারগুলির
দিমিত্রি সি

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