【C++语法】错误收集器如何做

eion 2002-03-08 03:45:49
如何实现下面的功能:

首要目标:程序运行时错误信息的收集,并显示和记录;

描述:

先看代码:
---------------------------------------------
static void (*g_fpErrMsgProcessor)(char*)=NULL;//定义一个全局的指向函数的变量,初值为0
void AfxRegisterErrorMsgProcessor( void (*fp)(char*) )//这个函数负责给它赋值
{
g_fpErrMsgProcessor = fp;
}
void AfxSendErrorMessage(char *sErrMsg)//大家都调用的一个接口函数
{
if( NULL!=g_fpErrMsgProcessor) g_fpErrMsgProcessor(sErrMsg);//对注册函数的具体调用
}
void Test_ErrorMsgProcessor(char *errMsg)//测试用的错误处理函数
{
AfxMessageBox(errMsg);
}
class AA
{
public: void Test()
{
try{................}
catch(CException *e){
AfxSendErrorMessage("AA::Test Error");} //在此对错误进行报告
}
};
class BB
{
public: void Test()
{
try{................}
catch(CException *e){
AfxSendErrorMessage("BB::Test Error");} //在此对错误进行报告
}
};
void main()
{
AfxRegisterErrorMsgProcessor(Test_ErrorMsgProcessor);//注册错误处理函数
AA a; BB b;
a.Test(); B.Text();//如果有错被catch到的话,应该有错误提示
}
----------------------------------------

大家应该看懂了,我是想在程序的任何地方可以调用AfxSendErrorMessage来报告错误,而
只需要在一个函数Test_ErrorMsgProcessor里进行处理就OK了。这个上面的代码可以做到。
但是:
如果我想把错误收集处理函数放到一个类里,我该如何进行声明和使用?即:
class MyClass
{
public:
void ErrorProcessor(char* msg){.......................}
void Initialize()
{
AfxRegisterErrorMsgProcessor(ErrorProcessor);//想做到这样注册一个成员函数,显然是Error
}
}
要想达到这样的目的,g_fpErrMsgProcessor和AfxRegisterErrorMsgProcessor,又该如何写?

希望得到高手高手高高手的大力援助,并不胜感激。
如果有做好的,请把关键代码贴出来。
由于有一定的难度,大家帮忙UP一下也可以。
没看懂可以提问
...全文
95 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooKid 2002-03-15
  • 打赏
  • 举报
回复
我做了一个,给你发过去,是基于虚函数的,派生一下就oK了
ookid@163.net
neccui 2002-03-08
  • 打赏
  • 举报
回复
可以很容易的扩展的。这样:

class BaseHandler()
{
public:
static int global_handler(void * arg, char *);
private:
virual int internal_handler(char *);
};

/*CPP*/
BaseHandler::global_hander(void * arg, char * msg)
{
return static_cast<BaseHandler *>(arg)-> internal_handler(msg);
}

通过派生出新的类就可以随意扩展。
eion 2002-03-08
  • 打赏
  • 举报
回复
在那?帮忙贴一下,OK?
nana11 2002-03-08
  • 打赏
  • 举报
回复
stdio里面是不是有一个,参照参照。
eion 2002-03-08
  • 打赏
  • 举报
回复
谢谢 PPC
这是个办法
不过由于错误处理通常还有有很多报告之类的东西,比如给出对话框,或在界面上显示,或存盘,或者在状态栏上给出提示等,这样就极不好扩展,对不?
neccui 2002-03-08
  • 打赏
  • 举报
回复
另外,你自己的函数不要叫Afx******,会引起误解的。
neccui 2002-03-08
  • 打赏
  • 举报
回复
如果放到类里面,那么就必须象回调函数一样,给出一个参数(arg)
这样,在类里写一个static function就可以了。
也就是说,除了g_fpErrMsgProcessor还有一个g_fpErrMsgArg

如果不想这样,
你在一个cpp源文件里以,生成一个实例
MyClass myErrProcessor;
你的函数默认使用这个实例。

ooKid 2002-03-08
  • 打赏
  • 举报
回复
好难哦
eion 2002-03-08
  • 打赏
  • 举报
回复
开始
eion 2002-03-08
  • 打赏
  • 举报
回复
开始

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧