VC抛出带GetLastError()错误的异常

本文介绍了十几年前Win32环境下,使用MTVERIFY宏进行错误检查和调试的方法,尤其强调了在不符合逻辑时抛出异常的重要性。通过实例展示了如何在代码中使用MTVERIFY,以及其在处理意外情况时的try-catch策略。
摘要由CSDN通过智能技术生成

说明:

十几年前,自己还在使用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);	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

微澜-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值