|
写了一个简单的错误捕捉的宏。用于简单的错误排查,这个类会自动输出当前出错的文件名,函数名,感觉在DEBUG的时候挺有用的。在这里记录一下,很简单的一个.h,使用很简单。windows和linux下都能运行。
建立一个define.h- #ifndef _DEFIINE_H
- #define _DEFIINE_H
- #include <stdio.h>
- #include <stdarg.h>
- #include <string.h>
- #include <errno.h>
- #include <time.h>
- #define SHOW_PRINT 1
- #define SHOW_WRITELOG 2
- //nType = 1为显示在桌面上,2为记录为日志
- void __show__(const char* pMsg, int nType)
- {
- if(nType == 1)
- {
- printf("[Error]%s", pMsg);
- }
- if(nType == 2)
- {
- FILE* pFile = fopen("assert.log", "a");
- if(pFile != NULL)
- {
- fwrite(pMsg, 1, strlen(pMsg), pFile);
- fwrite("\r\n", 1, 2, pFile);
- fclose(pFile);
- }
- else
- {
- printf("[Error]file open Error(%s).\n", strerror(errno));
- }
- }
- }
- void sprintf_safe(char* szText, int nLen, char* fmt ...)
- {
- if(szText == NULL)
- {
- return;
- }
- va_list ap;
- va_start(ap, fmt);
- vsnprintf(szText, nLen, fmt, ap);
- va_end(ap);
- }
- void __assertspecial__(const char* pFile, int nLen, const char* pFuncName, const char* pExpr, const char* pMsg)
- {
- char szTemp[1024] = {'\0'};
- char szDate[50] = {'\0'};
- struct tm *local;
- time_t t;
- t = time(NULL);
- local = localtime(&t);
- sprintf_safe(szDate, 50, "%04d-%02d-%02d %02d:%02d:%02d", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec);
- sprintf_safe(szTemp, 1024, "[%s](%s)(%d)(%s)(%s)(%s)\n", szDate, pFile, nLen, pFuncName, pExpr, pMsg);
- __show__(szTemp, SHOW_WRITELOG);
- }
- #ifdef WIN32
- #define AssertSpecial(type, msg) {if(type == false) { __assertspecial__(__FILE__, __LINE__, __FUNCTION__, #type, msg);} }
- #else
- #define AssertSpecial(type, msg) {if(type == false) { __assertspecial__(__FILE__, __LINE__, __PRETTY_FUNCTION__, #type, msg);} }
- #endif
- #define _ENTER_FUNCTION {try{
- #ifdef WIN32
- #define _LEAVE_FUNCTION }catch(...) { AssertSpecial(false, __FUNCTION__); }}
- #else
- #define _LEAVE_FUNCTION }catch(...) { AssertSpecial(false, __PRETTY_FUNCTION__); }}
- #endif
- #endif
复制代码
测试一下:- int main(int argc, char* argv[])
- {
- printf("[main]Begin.\n");
- _ENTER_FUNCTION
- throw 1;
- _LEAVE_FUNCTION
- return 0;
- }
复制代码
输出日志:
[2011-02-10 15:32:49](testerror.cpp)(14)(main)(false)(main)
其实这个可以稍微再改一下,支持一下msg,不过对于不复杂的错误检测,差不多够了,有助于查错。 |
|