用SEH的TRY---EXCEPT能够捕获到下面的这种异常错误
TRY
{
int a,b;
b=0;
a/=b;
}
EXCEPT()
{
// do something
MessageBox("Error");
}这段代码放在一个消息处理函数里是可以捕获到异常信息的,比如放在一个按钮事件处理函数里面,或者说WM_TIMER消息里面都可以捕获到。但是,我把它放到回调函数里面的时候,它无法捕获,直接告诉我程序出错。
这个回调函数是Windows多媒体定时器产生的,10ms执行一次。请问,如果在这种情况下捕获这种错误呢?附注:如何在多文档的入口处添加上捕获异常的代码?基于对话框的很好处理,但是基于多文档的如何添加呢?
TRY
{
int a,b;
b=0;
a/=b;
}
EXCEPT()
{
// do something
MessageBox("Error");
}这段代码放在一个消息处理函数里是可以捕获到异常信息的,比如放在一个按钮事件处理函数里面,或者说WM_TIMER消息里面都可以捕获到。但是,我把它放到回调函数里面的时候,它无法捕获,直接告诉我程序出错。
这个回调函数是Windows多媒体定时器产生的,10ms执行一次。请问,如果在这种情况下捕获这种错误呢?附注:如何在多文档的入口处添加上捕获异常的代码?基于对话框的很好处理,但是基于多文档的如何添加呢?
首先在头文件中定义两个变量:
UINT wTimerRes_1ms;
UINT Timer_1ms;
然后在CPP文件中定义如下变量(全局)
LONGLONG QPart1,QPart2;
double dfMinus, dfTim;
double dfCheckNum;
LARGE_INTEGER litmp;
double dfFreq;CYourDlg *pDlg;然后定义回调函数:
void PASCAL
OneMilliSecondProc(UINT wTimerID,UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2)
{
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;
dfMinus=(double)QPart2-QPart1;
dfTim=dfMinus/dfFreq;
dfTim=dfTim*1000;
pDlg->Run();//实验异常的代码
QPart1=QPart2;
}在Init里写如下代码:
TIMECAPS tc;
dfCheckNum=0;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;
timeGetDevCaps(&tc,sizeof(TIMECAPS));
timeBeginPeriod(1);
wTimerRes_1ms=10;
QueryPerformanceCounter(&litmp);
QPart1=litmp.QuadPart; if((Timer_1ms=timeSetEvent(wTimerRes_1ms,0,
(LPTIMECALLBACK)OneMilliSecondProc,(DWORD)this,
TIME_PERIODIC))==0)
{
AfxMessageBox("can't count");
}
else
{
//QueryPerformanceCounter(&litmp);
//QPart1 = litmp.QuadPart;
}在退出时候写入下面代码:
timeKillEvent(Timer_1ms);
timeEndPeriod(10);上面就是10ms执行一次Run的代码在Run里面写入如下调试代码:(C++捕获异常)
int a,b;
try
{
b=0;
a/=b;
}
catch(CException *e)
{
TCHAR buf[1024];
e->GetErrorMessage(buf,1024);
e->ReportError();
e->Delete();
} 结果:无法捕获。
4inSky(黑棋子):你说的有些道理,但怎么解决这个