السلام عليكم و رحمة الله و بركاته
فى الماضى عندما يحدث خطأ داخل احد برامجى كنت استخدم الـ try .. catch بالإضافه للماكرو __FILE__ و __FUNCTION__ و __LINE__ لمعرفة اسم الملف الذى حدث به الخطأ و اسم الداله و رقم السطر.
ففكرت بصنع class لتمثل الـ exception و وضع الماكرو بداخلها و بالتالى سيكون شكل الـ class كالتالى
#ifndef EXCEPTION_H
#define EXCEPTION_H
#include <string>
using namespace std;
class Exception
{
private:
string m_fileName;
string m_functionName;
int m_lineNumber;
protected:
string m_msg;
public:
Exception(string msg);
virtual ~Exception();
string getMessage();
string getFileName();
string getFunctionName();
int getLineNumber();
};
#endif // EXCEPTION_Hبالنسبه للدوال التى تبدأ بـ get فهى Accessor function و الكود الذى يهمنا هو كود المشيد حيث سيكون كالتالى:
Exception::Exception(string msg)
{
m_msg = msg;
m_fileName = __FILE__;
m_functionName = __FUNCTION__;
m_LineNumber = __LINE__;
}طبعا هذه الـ class لن تعمل كما هو متوقع منها لإنى نسيت شئ هام جدا و هو ان الماكرو سيتم عمل إحلال لإسمه بالقيمه الخاصه به و التى فى حالتنا هذه يأخذها من الـ preprocessor و تكون على التوالى اسم الملف و اسم الداله و رقم السطر و سيكونوا اسم الملف الخاص بهذه الـ class و الداله ستكون Exception::Exception اما رقم السطر سيكون على حسب كتابتى للكود.
بخلاف السابق الـ class ستعمل و لكن ما الهدف منها مادام الأمر يقتصر على متغير string يمكن الإستغناء عنها.
و سؤالى هل يمكن معرفة اسم الملف و الداله و رقم السطر الذى حدث بهم الخطأ اثناء runtime?
و الله ولى التوفيق
