C++ حسب ضرورت مستثنیات

C Hsb Drwrt Mstthnyat



C++ میں استثناء ایک بنیادی تصور ہے۔ ایک استثناء عمل درآمد کے وقت ہوتا ہے جب پروگرام کو رن ٹائم کی عدم مطابقت یا غیر معمولی منظرناموں کا سامنا ہوتا ہے۔ C++ میں، 'تھرو'، 'کوشش کریں'، اور 'کیچ' کی اصطلاحات استثنیٰ کو سنبھالنے یا پکڑنے کے لیے استعمال ہوتی ہیں۔ 'تھرو' کمانڈ کا استعمال استثنا پیدا کرنے کے لیے کیا جاتا ہے۔ 'کوشش' کی اصطلاح استثنا کو پھینکنے کا کام کرتی ہے، اور 'کیچ' کلیدی لفظ ایک استثناء کو سنبھالنے کی نمائندگی کرتا ہے جو 'تھرو' اصطلاح کے ساتھ تیار کیا گیا ہے اور 'کوشش' سیکشن کے ذریعہ پھینکا گیا ہے۔ آئیے C++ میں مستثنیات کو ظاہر کرنے کے لیے کچھ مثالوں میں غوطہ لگائیں۔

مثال 1: C++ میں حسب ضرورت استثناء کلاس بنانے کا پروگرام

یہ سادہ سی مثال C++ میں کسٹم ایکسپشن ہینڈلنگ اور پتہ لگانے کے لیے لاگو کی گئی ہے۔

# شامل کریں
#include
استعمال کرتے ہوئے نام کی جگہ std ;

کلاس DemoException : عوام رعایت
{
مجازی const چار * کیا ( ) const پھینکنا ( )
{
واپسی 'اپنی مرضی کی رعایت پکڑی گئی' ;
}
} ;
int مرکزی ( )
{
DemoException dEx ;
کوشش کریں
{
پھینکنا ڈی ایکس ;
}
پکڑنا ( رعایت اور سوائے )
{
cout << سوائے کیا ( ) << endl ;
}
واپسی 0 ;
}

ہم کوڈ میں ہیڈر فائل کی وضاحت کرتے ہیں بشمول 'iostream' اور 'exception'۔ 'iostream' کو خاص طور پر ان پٹ اور آؤٹ پٹ سٹریم کے لیے بلایا جاتا ہے، جب کہ 'استثنیٰ' لائبریری کو استثنا کو ہینڈل کرنے کے لیے بلایا جاتا ہے۔ اس کے بعد، ہم 'DemoException' کلاس بناتے ہیں جو C++ کی 'exception' کلاس سے ماخوذ ہے۔ یہاں، ہم نے ورچوئل what() فنکشن سیٹ کیا ہے جو const char* فراہم کرنے کے لیے استعمال کیا جاتا ہے جو ایک ایرر میسج کے نتائج دکھاتا ہے جو استثناء سے منسلک ہے۔







اس کے بعد، ہم ایک مین () فنکشن کو استعمال کرتے ہیں جہاں ہم 'DemoException' کلاس کا 'dEx' آبجیکٹ بناتے ہیں۔ اس کے بعد، ہمارے پاس ایک 'کوشش' بلاک کی تعریف ہے جو سامنا کرنے پر استثناء کو پھینک دیتی ہے۔ یہاں، ہم 'dEx' آبجیکٹ پھینک دیتے ہیں۔



اگلا، ہم نے استثناء کو پکڑنے اور اسے سنبھالنے کے لیے 'کیچ' بلاک سیٹ کیا۔ ہم کلاس استثنیٰ کا حوالہ بطور پیرامیٹر پاس کرتے ہیں تاکہ اس سے اخذ کردہ استثناء کو پکڑ سکیں۔ 'کیچ' بلاک کے اندر، ہم کنسول پر استثنائی پیغام حاصل کرنے کے لیے 'سوائے' پر what() فنکشن کو کال کرتے ہیں۔



دیئے گئے پروگرام کو انجام دینے کے بعد، اپنی مرضی کے استثناء کا پیغام پکڑا جاتا ہے اور کنسول پر پھینک دیا جاتا ہے:





مثال 2: دو کلاسوں کا استعمال کرتے ہوئے ایک حسب ضرورت استثناء تخلیق کرنے کا پروگرام

پروگرام متعدد استثنائیات سے نمٹنے پر زور دیتا ہے جنہیں متعدد کلاسوں کی وضاحت کرکے آزادانہ طور پر سنبھالا جاسکتا ہے۔



# شامل کریں
استعمال کرتے ہوئے نام کی جگہ std ;

کلاس تشخیص 1 { } ;
کلاس تشخیص2 { } ;

int مرکزی ( ) {
کوشش کریں {
پھینکنا تشخیص 1 ( ) ;
}
پکڑنا ( تشخیص1 e ) {
cout << 'Evaluation1 استثناء پکڑا گیا!' << endl ;
}
کوشش کریں {
پھینکنا تشخیص2 ( ) ;
}
پکڑنا ( evaluation2 e ) {
cout << 'تجزیہ 2 استثناء پکڑا گیا!' << endl ;
}

واپسی 0 ;
}

دیئے گئے کوڈ میں، ہمارے پاس دو کلاسز کی تعریف ہے، 'Evaluation1' اور 'Evaluation2'، جو اب خالی ہیں۔ اس کے بعد، ہم پروگرام کے مین () فنکشن کو انجام دیتے ہیں۔ یہاں، ہم نے try{} بلاک سیٹ کیا ہے جہاں 'throw' کلیدی لفظ 'Evaluation1()' کلاس کی مثال کو پھینکنے کے لیے استعمال ہوتا ہے۔ یہ اس بات کی نمائندگی کرتا ہے کہ 'Evaluation1' استثناء پھینک دیا جاتا ہے اگر اس 'Try' بلاک کے اندر پروگرام میں کوئی استثناء پیدا ہوتا ہے۔ اس کے بعد، ہمارے پاس ایک کیچ{} بلاک ہے جہاں استثناء پکڑا جاتا ہے اور استثناء کا پیغام دکھاتا ہے۔

اسی طرح، ہمارے پاس 'Evaluation2' کلاس کے لیے ایک اور کوشش{} بلاک کی تعریف ہے۔ اس کوشش{} بلاک کے اندر، ہم 'Evaluation2' کلاس کی مثال ڈالتے ہیں۔ اگر یہاں کوئی خرابی پیش آتی ہے تو یہ 'Evaluation2' کی رعایت کو پھینک دیتا ہے۔ پھر، اگر استثناء اس بلاک میں پکڑا جاتا ہے تو ہم 'cout' کمانڈ کا استعمال کرتے ہوئے استثنائی پیغام کو ظاہر کرنے کے لیے کیچ{} بلاک کو کہتے ہیں۔

مختلف 'ٹرائی کیچ' بلاکس کی دو مستثنیات کو کنسول میں پھینک دیا جاتا ہے جو دو مختلف کلاسوں کے ذریعہ سنبھالا جاتا ہے۔

مثال 3: کنسٹرکٹر کے ساتھ حسب ضرورت استثنیٰ بنانے کا پروگرام

پروگرام استثنیٰ کو سنبھالنے کے لیے کنسٹرکٹر کا استعمال کرتا ہے۔ اگرچہ ہم کنسٹرکٹر سے اقدار حاصل نہیں کر سکتے، ہم اسے 'ٹرائی کیچ' بلاک کا استعمال کر کے حاصل کر سکتے ہیں۔

# شامل کریں
استعمال کرتے ہوئے نام کی جگہ std ;

کلاس پرکھ {
int val ;

عوام :
پرکھ ( int n )
{
کوشش کریں {
اگر ( n == 0 )
val = n ;
ڈسپلے ( ) ;
}

پکڑنا ( const چار * exp ) {
cout << 'استثنیٰ پایا \n ' ;
cout << exp << endl ;
}

}

باطل ڈسپلے ( )
{
cout << 'قدر =' << val << endl ;
}
} ;

int مرکزی ( )
{

پرکھ ( 0 ) ;
cout << 'دوبارہ مثال بنانا \n ' ;
پرکھ ( 1 ) ;
}

دیئے گئے کوڈ میں، ہم 'ٹیسٹ' کلاس قائم کرتے ہیں جہاں متغیر کو ٹائپ انٹیجر کی 'ویل' قرار دیا جاتا ہے۔ اس کے بعد، ہمارے پاس 'Test()' کنسٹرکٹر فنکشن کی تعریف ہے جو 'n' متغیر کے ساتھ پاس ہوتی ہے۔ پھر ہم نے 'Test()' کنسٹرکٹر فنکشن کے اندر 'Try-catch' بلاک سیٹ کیا۔ ٹرائی بلاک کو if() اسٹیٹمنٹ کے ساتھ کہا جاتا ہے۔ اگر 'n' کی قدر صفر کے برابر ہے تو، 'کیچ' بلاک استثناء کو پکڑ لے گا، اور استثناء کا پیغام پرامپٹ پر پھینک دیا جائے گا۔ 'n' کی قدر 'val' متغیر میں محفوظ ہوتی ہے جب ہم اسے شروع کرتے ہیں۔

اس کے بعد، ہم 'val' متغیر میں ذخیرہ شدہ قدر دکھانے کے لیے ڈسپلے() فنکشن کو کال کرتے ہیں۔ اگلا، ہمارے پاس 'کیچ' بلاک کی تعریف ہے جہاں 'کوشش' بلاک کے ذریعہ دی گئی رعایت کو سنبھالا جاتا ہے۔ آخر میں، ہم مین() فنکشن کا مطالبہ کرتے ہیں۔ جس کے اندر، ہم 'Test()' کنسٹرکٹر کہتے ہیں۔ کنسٹرکٹر کو اس وقت متحرک کیا جاتا ہے جب 'Test()' کلاس کا آبجیکٹ بنایا جاتا ہے اور '0' کی قدر کے ساتھ مخصوص کیا جاتا ہے جس پر استثناء پھینکا جاتا ہے۔

اس کے بعد، ہم ایک مثال بنانے کے لیے دوبارہ 'Test()' کلاس کو کال کرتے ہیں جو 1 کی ویلیو کے ساتھ پاس ہوتی ہے۔ یہاں، کنسٹرکٹر کوئی رعایت نہیں دے گا کیونکہ ویلیو 0 کے برابر نہیں ہے۔ ڈسپلے() فنکشن ہوگا۔ 'val' کی قدر کو عمل میں لائیں اور پرنٹ کریں۔

کنسٹرکٹر کو کال کرکے کسٹم رعایت کنسول پر ڈالی جاتی ہے۔ نیز، جب شرط پوری ہو جاتی ہے، تو کنسٹرکٹر بغیر کسی رعایت کے عمل کرتا ہے۔

مثال 4: صارف کی وضاحت کردہ اپنی مرضی کے استثناء کو تخلیق کرنے کا پروگرام

یہاں پروگرام اس استثناء کو ہینڈل اور پکڑتا ہے جس کی وضاحت صارف کے پرامپٹ میں پوچھے جانے پر کی جاتی ہے۔

# شامل کریں
#include
استعمال کرتے ہوئے نام کی جگہ std ;
کلاس مائی ڈیمو : عوام رعایت {
عوام :
const چار * کیا ( ) const پھینکنا ( )
{
واپسی 'استثنیٰ! صفر سے تقسیم کرنے کی کوشش کی۔! \n ' ;
}
} ;
int مرکزی ( )
{
کوشش کریں
{
int n1، n2 ;
cout << 'دو عدد عدد درج کریں: \n ' ;
کھانا >> n1 >> n2 ;
اگر ( n2 == 0 )
{
مائی ڈیمو n3 ;
پھینکنا n3 ;
}
اور
{
cout << 'n1/n2 =' << n1 / n2 << endl ;
}
}
پکڑنا ( رعایت اور exc )
{
cout << exc کیا ( ) ;
}
}

دیئے گئے کوڈ میں، ہم سب سے پہلے 'MyDemo()' کلاس کی وضاحت کرتے ہیں جو کہ استثناء کی منحصر کلاس ہے۔ اس کے بعد، ہم نے 'ورچوئل' کلیدی لفظ کے ساتھ پبلک what() فنکشن سیٹ کیا۔ پروگرام میں رعایت کی وجہ جاننے کے لیے what() فنکشن کو پکارا جاتا ہے جب تھرو() فنکشن استثنا کو پھینک دیتا ہے۔ پھر، ہمارے پاس ایک مین() فنکشن ہے جہاں try-catch{} بلاکس کو استثنیٰ کا پتہ لگانے اور ہینڈل کرنے کے لیے بیان کیا گیا ہے۔ کوشش{} بلاک کے اندر، ہم دو متغیرات کا اعلان کرتے ہیں، 'n1' اور 'n2'، جن کی قدریں 'cin' کمانڈ کا استعمال کرتے ہوئے صارف سے لی جاتی ہیں۔ جب ہر ایک 'n1' اور 'n2' متغیر کے خلاف قدریں موصول ہوتی ہیں، تو 'if' حالت یہ جانچے گی کہ آیا 'n2' متغیر 0 کے برابر ہے یا نہیں۔ اگر ایسا ہے تو، ایک استثنا دیا جاتا ہے یا تقسیم کے نتائج واپس کردیئے جاتے ہیں۔ آخر میں، ہمارے پاس ایک کیچ{} بلاک ہے جو 'استثنیٰ' کلاس کا حوالہ اس سے وراثت میں ملنے والے پیرامیٹر کے طور پر لیتا ہے۔

آؤٹ پٹ ظاہر کرتا ہے جب شرط پوری نہیں ہوتی ہے اور پروگرام کو بغیر کسی استثناء کے عمل میں لایا جاتا ہے:

اس کے علاوہ، ہم '0' کی قدر کو 'n2' متغیر سے متعین کرتے ہیں تاکہ یہ ظاہر کیا جا سکے کہ پروگرام میں استثناء کو کیسے پھینکا اور پکڑا جاتا ہے۔

نتیجہ

آخر میں، ہم نے C++ کے اہم تصور کا مظاہرہ کیا جو ایک استثناء ہے۔ ایک استثناء پروگرام کے باقاعدہ نفاذ میں رکاوٹ ہے۔ اس کے لیے، ہم نے پروگرام میں ہونے والی رعایت کو سنبھالنے کے لیے 'تھرو'، 'کوشش کریں'، اور 'کیچ' کلیدی الفاظ کا استعمال کیا۔ ہم نے ان مطلوبہ الفاظ کو پچھلی مثالوں میں استثنیٰ کو مختلف طریقے سے ہینڈل کرنے کے لیے استعمال کیا ہے۔