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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网速递520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值