C++ 编程处理字符串经常出错,小弟我自己接管了Windows的那个异常报告
C++ 编程处理字符串经常出错,我自己接管了Windows的那个错误报告
/* ---------------------------------- 字符串处理异常错误响应的实现 使用方法: 1、定义InvalidParameterHandle这个错误响应回调函数,如果strcpy这类CRT函数出错,会调用此函数响应错误 2、在程序入口点定义_CrtSetReportMode( _CRT_ASSERT, 0 );接管VC的错误处理机制 ---------------------------------- */ #include <Windows.h> #include <tchar.h> #include <stdio.h> #include <errno.h> #include <locale.h> #include <string.h> #include <crtdbg.h> #include <strsafe.h> // CRT 标准运行库中的字符串处理函数异常错误响应回调函数 void InvalidParameterHandle( LPCTSTR lpExpression, LPCTSTR lpFunction, LPCTSTR lpFile, UINT line, uintptr_t uip = NULL ); int _tmain() { _CrtSetReportMode( _CRT_ASSERT, 0 ); // 所有线程都使用同样的区域配置 _configthreadlocale( _DISABLE_PER_THREAD_LOCALE ); // 设置当前进程的区域配置为中文中国 _tsetlocale( LC_ALL, /*_T("chinese_china")*/_T("Chinese_People's Republic of China") ); _tprintf_s( L"字符串处理示例程序:\n" ); // 传统字符串处理函数 // 注册用户定义的异常处理函数 _set_invalid_parameter_handler( InvalidParameterHandle ); TCHAR szSourceStr[20] = _T("Hello World!\n"); TCHAR szDestination[10] = _T("---"); errno_t result = _tcscpy_s( szDestination, _countof(szDestination), szSourceStr ); return 0; } // CRT 标准运行库中的字符串处理函数异常错误响应回调函数 void InvalidParameterHandle( LPCTSTR lpExpression, LPCTSTR lpFunction, LPCTSTR lpFile, UINT line, uintptr_t uip ) { TCHAR szErrorReason[BUFSIZ] = {0}; switch( errno ) { case E2BIG:_tcscpy_s( szErrorReason, BUFSIZ, _T("argument list too long") ); break; case EACCES: _tcscpy_s( szErrorReason, BUFSIZ, _T("permission denied") ); break; case EADDRINUSE: _tcscpy_s( szErrorReason, BUFSIZ, _T("address in use") ); break; case EADDRNOTAVAIL: _tcscpy_s( szErrorReason, BUFSIZ, _T("address not available") ); break; case EAFNOSUPPORT: _tcscpy_s( szErrorReason, BUFSIZ, _T("address family not supported") ); break; case EAGAIN: _tcscpy_s( szErrorReason, BUFSIZ, _T("resource unavailable try again") ); break; case EALREADY: _tcscpy_s( szErrorReason, BUFSIZ, _T("connection already in progress") ); break; case EBADF: _tcscpy_s( szErrorReason, BUFSIZ, _T("bad file descriptor") ); break; case EBADMSG: _tcscpy_s( szErrorReason, BUFSIZ, _T("bad message") ); break; case EBUSY: _tcscpy_s( szErrorReason, BUFSIZ, _T("device or resource busy") ); break; case ECANCELED: _tcscpy_s( szErrorReason, BUFSIZ, _T("operation canceled") ); break; case ECHILD: _tcscpy_s( szErrorReason, BUFSIZ, _T("no child process") ); break; case ECONNABORTED: _tcscpy_s( szErrorReason, BUFSIZ, _T("connection aborted") ); break; case ECONNREFUSED: _tcscpy_s( szErrorReason, BUFSIZ, _T("connection refused") ); break; case ECONNRESET: _tcscpy_s( szErrorReason, BUFSIZ, _T("connection reset") ); break; case EDEADLK: _tcscpy_s( szErrorReason, BUFSIZ, _T("resource deadlock would occur") ); break; case EDESTADDRREQ: _tcscpy_s( szErrorReason, BUFSIZ, _T("destination address required") ); break; case EDOM: _tcscpy_s( szErrorReason, BUFSIZ, _T("argument out of domain") ); break; case EEXIST: _tcscpy_s( szErrorReason, BUFSIZ, _T("file exists") ); break; case EFAULT: _tcscpy_s( szErrorReason, BUFSIZ, _T("bad address") ); break; case EFBIG: _tcscpy_s( szErrorReason, BUFSIZ, _T("file too large") ); break; case EHOSTUNREACH: _tcscpy_s( szErrorReason, BUFSIZ, _T("host unreachable") ); break; case EIDRM: _tcscpy_s( szErrorReason, BUFSIZ, _T("identifier removed") ); break; case EILSEQ: _tcscpy_s( szErrorReason, BUFSIZ, _T("illegal byte sequence") ); break; case EINPROGRESS: _tcscpy_s( szErrorReason, BUFSIZ, _T("operation in progress") ); break; case EINTR: _tcscpy_s( szErrorReason, BUFSIZ, _T("interrupted") ); break; case EINVAL: _tcscpy_s( szErrorReason, BUFSIZ, _T("invalid argument") ); break; case EIO: _tcscpy_s( szErrorReason, BUFSIZ, _T("io error") ); break; case EISCONN: _tcscpy_s( szErrorReason, BUFSIZ, _T("already connected") ); break; case EISDIR: _tcscpy_s( szErrorReason, BUFSIZ, _T("is a directory") ); break; case ELOOP: _tcscpy_s( szErrorReason, BUFSIZ, _T("too many synbolic link levels") ); break; case EMFILE: _tcscpy_s( szErrorReason, BUFSIZ, _T("too many files open") ); break; case EMLINK: _tcscpy_s( szErrorReason, BUFSIZ, _T("too many links") ); break; case EMSGSIZE: _tcscpy_s( szErrorReason, BUFSIZ, _T("message size") ); break; case ENAMETOOLONG: _tcscpy_s( szErrorReason, BUFSIZ, _T("filename too long") ); break; case ENETDOWN: _tcscpy_s( szErrorReason, BUFSIZ, _T("network down") ); break; case ENETRESET: _tcscpy_s( szErrorReason, BUFSIZ, _T("network reset") ); break; case ENETUNREACH: _tcscpy_s( szErrorReason, BUFSIZ, _T("network unreachable") ); break; case ENFILE: _tcscpy_s( szErrorReason, BUFSIZ, _T("too many files open in system") ); break; case ENOBUFS: _tcscpy_s( szErrorReason, BUFSIZ, _T("no buffer space") ); break; case ENODATA: _tcscpy_s( szErrorReason, BUFSIZ, _T("no message available") ); break; case ENODEV: _tcscpy_s( szErrorReason, BUFSIZ, _T("no such device") ); break; case ENOENT: _tcscpy_s( szErrorReason, BUFSIZ, _T("no such file or directory") ); break; case ENOEXEC: _tcscpy_s( szErrorReason, BUFSIZ, _T("executable format error") ); break; case ENOLCK: _tcscpy_s( szErrorReason, BUFSIZ, _T("no lock available") ); break; case ENOLINK: _tcscpy_s( szErrorReason, BUFSIZ, _T("no link") ); break; case ENOMEM: _tcscpy_s( szErrorReason, BUFSIZ, _T("not enough memory") ); break; case ENOMSG: _tcscpy_s( szErrorReason, BUFSIZ, _T("no message") ); break; case ENOPROTOOPT: _tcscpy_s( szErrorReason, BUFSIZ, _T("no protocol option") ); break; case ENOSPC: _tcscpy_s( szErrorReason, BUFSIZ, _T("no space on device") ); break; case ENOSR: _tcscpy_s( szErrorReason, BUFSIZ, _T("no stream resources") ); break; case ENOSTR: _tcscpy_s( szErrorReason, BUFSIZ, _T("not a stream") ); break; case ENOSYS: _tcscpy_s( szErrorReason, BUFSIZ, _T("function not supported") ); break; case ENOTCONN: _tcscpy_s( szErrorReason, BUFSIZ, _T("not connected") ); break; case ENOTDIR: _tcscpy_s( szErrorReason, BUFSIZ, _T("not a directory") ); break; case ENOTEMPTY: _tcscpy_s( szErrorReason, BUFSIZ, _T("directory not empty") ); break; case ENOTRECOVERABLE: _tcscpy_s( szErrorReason, BUFSIZ, _T("state not recoverable") ); break; case ENOTSOCK: _tcscpy_s( szErrorReason, BUFSIZ, _T("not a socket") ); break; case ENOTSUP: _tcscpy_s( szErrorReason, BUFSIZ, _T("not supported") ); break; case ENOTTY: _tcscpy_s( szErrorReason, BUFSIZ, _T("inappropriate io control operation") ); break; case ENXIO: _tcscpy_s( szErrorReason, BUFSIZ, _T("no such device or address") ); break; case EOPNOTSUPP: _tcscpy_s( szErrorReason, BUFSIZ, _T("operation not supported") ); break; case EOTHER: _tcscpy_s( szErrorReason, BUFSIZ, _T("other") ); break; case EOVERFLOW: _tcscpy_s( szErrorReason, BUFSIZ, _T("value too large") ); break; case EOWNERDEAD: _tcscpy_s( szErrorReason, BUFSIZ, _T("owner dead") ); break; case EPERM: _tcscpy_s( szErrorReason, BUFSIZ, _T("operation not permitted") ); break; case EPIPE: _tcscpy_s( szErrorReason, BUFSIZ, _T("broken pipe") ); break; case EPROTO: _tcscpy_s( szErrorReason, BUFSIZ, _T("protocol error") ); break; case EPROTONOSUPPORT: _tcscpy_s( szErrorReason, BUFSIZ, _T("protocol not supported") ); break; case EPROTOTYPE: _tcscpy_s( szErrorReason, BUFSIZ, _T("wrong protocol type") ); break; case ERANGE: _tcscpy_s( szErrorReason, BUFSIZ, _T("result out of range") ); break; case EROFS: _tcscpy_s( szErrorReason, BUFSIZ, _T("read only file system") ); break; case ESPIPE: _tcscpy_s( szErrorReason, BUFSIZ, _T("invalid seek") ); break; case ESRCH: _tcscpy_s( szErrorReason, BUFSIZ, _T("no such process") ); break; case ETIME: _tcscpy_s( szErrorReason, BUFSIZ, _T("stream timeout") ); break; case ETIMEDOUT: _tcscpy_s( szErrorReason, BUFSIZ, _T("timed out") ); break; case ETXTBSY: _tcscpy_s( szErrorReason, BUFSIZ, _T("text file busy") ); break; case EWOULDBLOCK: _tcscpy_s( szErrorReason, BUFSIZ, _T("operation would block") ); break; case EXDEV: _tcscpy_s( szErrorReason, BUFSIZ, _T("cross device link") ); break; } TCHAR szPromptErrorMsg[BUFSIZ] = {0}; _stprintf_s( szPromptErrorMsg, _T("程序处理字符串出现异常,中止运行。\n>错误原因:%s。\n"), szErrorReason ); #ifdef _DEBUG TCHAR szErrorStr[BUFSIZ] = {0}; _stprintf_s( szErrorStr, _T(">错误文件:%s。\n>错误函数:%s。\n>错误位置:%d。\n"), lpFile, lpFunction, line ); _tcscat_s( szPromptErrorMsg, BUFSIZ, szErrorStr ); #endif MessageBox( NULL, szPromptErrorMsg, _T("Fatal Error"), MB_OK | MB_ICONEXCLAMATION ); exit(-255); }