异常:从自己的函数引发的异常。

单独使用 MFC 异常处理的示例捕捉函数引发的异常在 MFC 或其他库中是可行的。 除了库代码引发的捕获异常外,还可以引发从您的代码的异常,如果要编写可能遇到异常的功能。

引发异常时,该函数的执行将停止,并跳转直接对 catch 块最里面的异常帧。 异常 framework 忽略常规退出功能的路径。 因此,您必须确保删除那些定期将删除现有内存块。

引发异常

  1. 使用一个 MFC helper 函数,如 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 );
    }
    

    如果第一个分配失败,则可以引发内存异常。 如果第一个分配成功,而第二个失败,则必须释放第一个分配在引发异常之前块。 如果两个分配成功,可以继续正常工作,并释放块,当退出该函数时。

     – 或 – 

  2. 使用用户定义的异常指示问题情况。 可以引发任何类型,甚至整个类项目,为异常。

    ,如果有错误,下面的示例尝试通过数设备播放声音并引发异常。

    #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 的默认处理异常仅适用于指针于 CExceptionCException对象 (和对象是从派生的类)。上面的示例跳过 MFC 的异常结构。

请参见

概念

异常处理在MFC