الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

التحكم بأخطاء وقت التنفيذ

بدأه omani في 18 فبراير 2010 · 3 رد · 595 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام علكيم ورحمة الله وبركاته

أحاول التحكم بأخطاء وقت التنفيد وفي المثال التالي . يقوم حاولت ان اضع مثال لكيفة التحكم ولكنني لم استطع .

ارجو تصحيح المثال

#include<iostream.h>

void main()
{
  int m[5]={1,2,3,4,5},i;

  try
	{
	 m[2]=20;
	 m[5]=30;// في حالة ايقاف هذا السطر ايضا احصل على نفس النتيجة 
  throw 100;
  }

  catch(int er)
	{
	 cout<<"Over Range Error";
	}

	for(i=0;i<5;i++)
	 cout<<"\t"<<m;

}

تحياتي

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#3

في السي بلس ، وعند استخدام المصفوفات المعتادة ، فإنه لا توجد آلية واضحة لكيفية اكتشاف حدوث " تجاوز لحجم المصفوفة " .

أي أنه لن تستطيع اقتناص الخطأ ومعالجته ، بالشكل الذي تريد ، ( كالموجود في لغات أخرى مثل لغات الدوت نت أو الجافا ) .

المشكلة هي بأنه لاتوجد ردة فعل واضحة ، اذا تجاوزت مدى المصفوفة ،

فقد يكمل برنامجك العمل دون أن تلاحظ شيء ، وقد تظهر رسالة خطأ من نظام التشغيل ، وقد يعمل Debugger و ما إلى ذلك ،

وفي كل الأحوال ، لن تعرف بسهولة أنك وقعت في خطأ تجاوز المدى المسموح به ،

وبالتالي يجب عليك ان تكتب " فئة - class " ، تقوم مقام المصفوفات العادية وتعمل throw اذا تجاوزت المدى ، Out Of Range ، يمكنك القراءة عن كيفية تطوير مثل هذه الفئة من رابط الأخ محمد أو من فهرس المنتدى .

الحل الآخر هو أن تستفيد من المكتبة القياسية STL ، التي توفّر لك فئات ممتازة مثل vector ، ويمكن أن تستفيد منها ، بهذا الشكل .

#include<iostream>
#include<vector>
using namespace std ; 
int main()
{
	std::vector<int> m( 5 ) ; // 5 elements;
	m[0] = 0 ;
	m[1] = 1 ;
	m[2] = 2 ;
	m[3] = 3 ;
	m[4] = 4 ;
 try
 {
 	m[2]=20;
 //m[100] = 2; // هنا لن يطلق استثناء .. لماذا ؟
 m.at(100);

 }
 catch(std::out_of_range& e)
 	{
			cout<<"Out of Range " << e.what()<< std::endl;
 	}

 for(int i=0;i<m.size();i++)
 	cout<<"\t"<<m;

		int a;
		std::cin>> a;

		return 0;

}

لكن الغريب أنه لن يظهر استثناء اذا حاولت الوصول للعنصر رقم 100 وتغيير قيمته ؟ يبدو أن هذا operator المدعو [ ] ، لايطلق استثناء .

الطريقة الأخرى وهي ببناء كلاس خاص بك ، سيبدو هكذا :

#include<iostream>
#include<vector>
using namespace std ; 

class MyArray
{
	int *m;
	int size ;
public:
	MyArray(int size)
	{
		// TODO : validate "size" !
		m = new int [size];
		this->size = size;
	}
	int operator[](int index) const
	{
		if(index >= size)
			throw std::out_of_range("Out Of Range Exception ");
		else
		return m[index];
	}
	int& operator[](int index) 
	{
		if(index >= size)
			throw std::out_of_range("Out Of Range Exception ");
		else
		return m[index];
	}
};

int main()
{
 MyArray arr(3);
 arr[0] = 1;
 arr[1] = 2;
 arr[2] = 3;
 try
 {
 	arr[10] = 1000; // will throw an exception
	arr[0] = 15; // not accessible !
 }
 catch(std::out_of_range &e)
 {
 std::cout << e.what() << std::endl;
 }
 for(int i=0;i<3;i++)
 cout<<arr<<std::endl;

		int a;
		std::cin>> a;

 return 0;

}

طبعاً الكلاس MyArray كتبته قبل قليل ، وقد يكون مليء بالأخطاء ..

وهناك حل آخر ، وهو أن تقرأ عن Boost والحلول التي قدمتها .. هناك مقالات للأخ "خالد الشايع" بهذا الخصوص .

تم تعديل هذه المشاركة بواسطة الشمري في 19 فبراير 2010 في 13:18

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#4

الاستاذ محمد علاء ... شكرا على الرابط

الاستاذ الشمري ... ألف شكر على الشرح الوافي .

تحياتي

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

مواضيع مشابهة