网上看到有些人是自己封装了一些中断函数,比如调用__asm{INT 21H};等。
突然想到,可以直接用C++语言本身提供的try..catch语句啊。FOOL -.-
写了一个测试类:
#pragma once #include <windows.h> #include <iostream> using namespace std; class CTestClass { public: CTestClass(UINT64 qwPosBegin, UINT64 qwPosEnd) { try { INT64 qwSize = (INT64)(qwPosEnd - qwPosBegin); if(qwSize < 0) throw qwSize; m_qwPosBegin = qwPosBegin; m_qwPosEnd = qwPosEnd; m_qwSize = m_qwPosEnd - m_qwPosBegin; } catch(INT64 &qwSize) { const int BUF_LEN = 100; WCHAR szBuff[BUF_LEN] = {0}; swprintf(szBuff, BUF_LEN, L"Segment length is negative! Value: %I64d", qwSize); ::MessageBoxW(NULL, szBuff, L"Error", MB_OK|MB_ICONERROR);
//delete this; } } ~CTestClass() { cout<<"This is Destruct Method"<<endl; m_qwPosBegin = 0; m_qwPosEnd = 0; m_qwSize = 0; OutputInfo(); } void OutputInfo() { cout<<"Pos Begin: "<<m_qwPosBegin<<endl; cout<<"Pos End: "<<m_qwPosEnd<<endl; cout<<"Segment Len: "<<m_qwSize<<" "<<endl; } private: UINT64 m_qwPosBegin;//using UING64 instead of INT64 to contain as more data as possible UINT64 m_qwPosEnd; UINT64 m_qwSize; };
调用代码:
void main() { #define SAFE_DELETE_OBJECT(obj) if(obj) { delete obj; obj = NULL;} CTestClass* obj1 = new CTestClass(10, 100); if(obj1) obj1->OutputInfo(); CTestClass* obj2 = new CTestClass(100, 10); if(obj2) obj2->OutputInfo(); SAFE_DELETE_OBJECT(obj1); SAFE_DELETE_OBJECT(obj2); system("pause"); }
测试输出结果:
Pos Begin: 10
Pos End: 100
Segment Len: 90
Pos Begin: 13451671603782742029
Pos End: 13451671603782742029
Segment Len: 13451671603782742029
This is Destruct Method
Pos Begin: 0
Pos End: 0
Segment Len: 0
This is Destruct Method
Pos Begin: 0
Pos End: 0
Segment Len: 0
请按任意键继续. . .
一点解释:throw之后就会跳出整个try块,因此可能出问题的代码要写在最前面--所谓“要写异常安全的函数” 呵呵 有歧义 这里的"异常"是“Exception” n. ,而非“Extraordinary” adj. 的意思 -.-