说明:
十几年前,自己还在使用VC,有些地方需要特别注意,如果进入该逻辑就应该抛出异常。
转发winrtp中抛出异常函数,在不符合逻辑的地方,直接写入
MTVERIFY("这个地方有问题");
要说它有什么特别之处吗?我觉得是它的宏定义很有特点。
代码:
/*
*MtVerify.h
*Error handing for application in "multithreading applicationgs in win32"
*/
#pragma comment(lib,"USER32")
#include <crtdbg.h>
#define MTASSERT(a) _ASSERTE(a)
#define MTVERIFY(a) if(!(a)) PrintError(#a,__FILE__,__LINE__,GetLastError())
static void PrintError(LPSTR linedesc,LPSTR filename, int lineno,DWORD errnum)
{
LPSTR lpBuffer;
char errbuf[256];
#ifdef _WINDOWS
char modulename[MAX_PATH];
#else
DWORD numread;
#endif
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
|FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
errnum,
LANG_NEUTRAL,
(LPSTR)&lpBuffer,
0,
NULL);
wsprintf(errbuf,"\nThe following call failed at line %d in %s:\n\n"
" %s\n\nReason:%s\n",lineno,filename,linedesc,lpBuffer);
#ifndef _WINDOWS
WriteFile(GetStdHandle(STD_ERROR_HANDLE),errbuf,strlen(errbuf),&numread,FALSE);
#else
GetModuleFileName(NULL,modulename,MAX_PATH);
MessageBox(NULL,errbuf,modulename,MB_ICONWARNING|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND);
#endif
exit(EXIT_FAILURE);
}
使用try
如果真的遇到不需要退出的意外,拿不定主意只能使用try了。
try{}
catch (Exception ex){
CString str;
str.Format("%d",ex.ErrorCode());
OutputDebugString(str); }