Exception Safety এবং Stack Unwinding সি++ প্রোগ্রামিংয়ে গুরুত্বপূর্ণ ধারণা যা প্রোগ্রামের ত্রুটি ব্যবস্থাপনা এবং নিরাপত্তা নিশ্চিত করে। এগুলো নিশ্চিত করে যে যখন একটি এক্সসেপশন ঘটে তখন প্রোগ্রাম ক্র্যাশ না করে সঠিকভাবে সাফ এবং রিসোর্সগুলি মুক্ত হয়।
১. Exception Safety
Exception Safety হল এমন একটি ধারণা যা প্রোগ্রাম বা ফাংশনগুলোকে এমনভাবে ডিজাইন করে যাতে এক্সসেপশন ঘটলে, সিস্টেমের স্থিতিশীলতা এবং মেমরি নিরাপত্তা নিশ্চিত থাকে। এটি নিশ্চিত করে যে একটি এক্সসেপশন ঘটলেও কোনও ডেটা ক্ষতি বা মেমরি লিক হবে না, এবং প্রোগ্রামটি সঠিকভাবে চলতে থাকবে।
সি++ এ তিনটি স্তরের exception safety আছে:
- No-throw guarantee (No-throw safety): যদি কোনো এক্সসেপশন ঘটে, তবে ফাংশন বা কোড কোনো রকম মিউটেশন বা পরিবর্তন করবে না এবং কোনো রিসোর্স মুক্ত হবে না। এটি সবচেয়ে নিরাপদ স্তর।
- Basic guarantee (Basic safety): এক্সসেপশন ঘটলেও প্রোগ্রামের অবস্থা অপরিবর্তিত থাকবে এবং কোন অবাঞ্ছিত পার্শ্বপ্রতিক্রিয়া হবে না। তবে, কিছু রিসোর্স মুক্ত করা না হতে পারে।
- Strong guarantee (Strong safety): এক্সসেপশন ঘটলে প্রোগ্রাম আগের অবস্থায় ফিরে যাবে, অর্থাৎ প্রোগ্রামটি পুরোপুরি রোলব্যাক হয়ে যাবে। এক্সসেপশন ঘটলে কোনও পরিবর্তন হবে না এবং অবস্থা অপরিবর্তিত থাকবে।
উদাহরণ: Exception Safety
#include <iostream>
#include <vector>
class MyClass {
public:
MyClass(int size) : data(size, 0) {}
// নিরাপদ ফাংশন যা কপি অপারেশন করে
void set(int index, int value) {
if (index < 0 || index >= data.size()) {
throw std::out_of_range("Index out of range");
}
data[index] = value;
}
private:
std::vector<int> data;
};
int main() {
try {
MyClass obj(10);
obj.set(5, 100); // সঠিক কল
obj.set(20, 200); // এরর, এক্সসেপশন হবে
}
catch (const std::exception& e) {
std::cout << "Exception caught: " << e.what() << std::endl;
}
return 0;
}এখানে, set ফাংশনে যদি ইনডেক্স ভুল হয়, তাহলে একটি std::out_of_range এক্সসেপশন ঘটে। এই ফাংশনে Basic guarantee রয়েছে, অর্থাৎ এক্সসেপশন ঘটলেও, কোন ডেটা পরিবর্তন হবে না এবং সিস্টেমের অবস্থা অপরিবর্তিত থাকবে।
২. Stack Unwinding
Stack Unwinding হল সেই প্রক্রিয়া যা ঘটে যখন একটি এক্সসেপশন তৈরি হয় এবং স্ট্যাকের উপর থেকে সমস্ত ফাংশন কল ফিরে আসে। যখন এক্সসেপশন ঘটে, সি++ এ প্রোগ্রামটি "stack unwinding" প্রক্রিয়া শুরু করে, যা প্রতিটি ফাংশন কলের ক্ষেত্রে স্থানীয় স্ট্যাক ভেরিয়েবলগুলোকে ধ্বংস করে এবং তারপরে আগের ফাংশন কলের স্ট্যাক ফ্রেমে ফিরে যায়। এটি এক্সসেপশন ঘটলে ফাংশনগুলোর মধ্যে নির্দিষ্ট কাজ সম্পন্ন করতে সাহায্য করে, যেমন রিসোর্সগুলি মুক্ত করা (যেমন ডেস্ট্রাক্টর কল করা)।
Stack Unwinding এর মাধ্যমে:
- ডেস্ট্রাক্টর কল করা হয়, যা স্ট্যাক-ভিত্তিক রিসোর্সগুলি সঠিকভাবে মুক্ত করে।
- কোন রিসোর্স বা অবস্থা ক্ষতিগ্রস্ত না হয়ে প্রোগ্রাম চলতে থাকে।
উদাহরণ: Stack Unwinding
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass Constructor" << std::endl; }
~MyClass() { std::cout << "MyClass Destructor" << std::endl; }
void doSomething() {
std::cout << "Doing something!" << std::endl;
throw std::runtime_error("Error occurred");
}
};
void testFunction() {
MyClass obj;
obj.doSomething(); // এক্সসেপশন হবে
}
int main() {
try {
testFunction();
}
catch (const std::exception& e) {
std::cout << "Exception caught: " << e.what() << std::endl;
}
return 0;
}এখানে, testFunction ফাংশনে obj.doSomething() কলের সময় একটি std::runtime_error এক্সসেপশন ঘটবে। এক্সসেপশন ঘটলে, MyClass এর ডেস্ট্রাক্টরটি কল হবে, কারণ এটি স্ট্যাক-ভিত্তিক একটি অবজেক্ট, এবং তাই stack unwinding এর মাধ্যমে এটি সঠিকভাবে পরিষ্কার হয়ে যাবে।
আউটপুট হবে:
MyClass Constructor
Doing something!
MyClass Destructor
Exception caught: Error occurredএখানে, MyClass এর কনস্ট্রাক্টর প্রথমে কল হয়, তারপর doSomething কল করা হয়, এবং এক্সসেপশন ঘটলে, MyClass এর ডেস্ট্রাক্টর কল হয় (stack unwinding), তারপর catch ব্লক ত্রুটির বার্তা দেখায়।
Stack Unwinding এবং Exception Safety এর সম্পর্ক
যখন এক্সসেপশন ঘটে এবং stack unwinding ঘটে, সি++ নিশ্চিত করে যে:
- অ্যাক্সেসযোগ্য রিসোর্সগুলি মুক্ত করা হবে (যেমন ডেস্ট্রাক্টর কল করা)।
- সংশ্লিষ্ট ফাংশন কলগুলির স্ট্যাক ফ্রেমে থাকা ডেটা সঠিকভাবে ধ্বংস হবে।
- প্রোগ্রামটি সঠিকভাবে পুনরুদ্ধার হবে (যদিও এক্সসেপশন ঘটেছে) যদি সঠিক exception safety গ্যারান্টি অনুসরণ করা হয়।
সারাংশ
- Exception Safety: এটি ফাংশনগুলির জন্য এক্সসেপশন ঘটলে তাদের নিরাপদভাবে কার্যক্রম চালিয়ে যাওয়া এবং সিস্টেমের অবস্থা অপরিবর্তিত রাখার গ্যারান্টি প্রদান করে।
- Stack Unwinding: যখন এক্সসেপশন ঘটে, সি++ স্ট্যাকের উপর থেকে প্রতিটি ফাংশন কল ধ্বংস করে এবং সংশ্লিষ্ট ডেস্ট্রাক্টরগুলিকে কল করে, যাতে সমস্ত রিসোর্স মুক্ত হয়।
Stack unwinding এবং exception safety এর সঠিক ব্যবস্থাপনা সি++ প্রোগ্রামগুলিকে নিরাপদ, দক্ষ এবং স্থিতিশীল রাখে।
Read more