/*
----------------------------------------------------------------------
字符串处理异常错误响应的实现
使用方法:
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);
}
C++ 编程处理字符串经常出错,我自己接管了Windows的那个错误报告
最新推荐文章于 2023-07-21 16:28:56 发布