可以只使用 MFC 异常处理范例来捕获 MFC 或其他库中函数引发的异常。 除了捕获库代码引发的异常之外,如果要编写可能遇到异常条件的函数,还可以从自己的代码中引发异常。
引发异常时,将停止当前函数的执行,并直接跳转到 catch
最内部异常帧的块。 异常机制绕过函数的正常退出路径。 因此,必须确保删除在正常退出时将删除的那些内存块。
引发异常
使用 MFC 帮助程序函数之一,例如
AfxThrowMemoryException
。 这些函数引发适当类型的预分配异常对象。在以下示例中,函数尝试分配两个内存块,并在任一分配失败时引发异常:
{ char* p1 = (char*)malloc(SIZE_FIRST); if (p1 == NULL) AfxThrowMemoryException(); char* p2 = (char*)malloc(SIZE_SECOND); if (p2 == NULL) { free(p1); AfxThrowMemoryException(); } // ... Do something with allocated blocks ... // In normal exit, both blocks are deleted. free(p1); free(p2); }
如果第一个分配失败,只需引发内存异常。 如果第一个分配成功,但第二个分配失败,则必须释放第一个分配块,然后再引发异常。 如果两个分配都成功,则可以正常继续,并在退出函数时释放块。
- 或 -
使用用户定义的异常来指示问题条件。 可以引发任何类型的项(甚至整个类)作为异常。
以下示例尝试通过波形设备播放声音,并在发生故障时引发异常。
#define WAVE_ERROR -5 { // This Win32 API returns 0 if the sound cannot be played. // Throw an integer constant if it fails. if (!PlaySound(_T("SIREN.WAV"), NULL, SND_ASYNC)) throw WAVE_ERROR; }
注释
MFC 对异常的默认处理仅适用于指向 CException
对象的指针(和派生类的对象 CException
)。 上面的示例绕过 MFC 的异常机制。