プログラミングメモ →目次

CExceptionからクラスを派生する(VC++)

VC++のプログラムの中で、例外を投げる方法についてのメモです。CExceptionクラスから自分のクラスを派生して、例外処理を必要とされる時に例外を投げます。VC++では、下記のthrow+try+catch機構を利用して、例外処理を行います。

try
{
    ... ...
    ある処理();
    ... ...
}
catch(CException *e)
{
    e->表示などの処理();
    e->Delete();
}

ある処理()
{
    ... ...
    throw new CException();
    ... ...
}

例:「世界のナベアツ」。乱数を発生して、3の倍数の数字が出たら、例外を投げる。

//派生クラスを作成する
class CMyException : public CException
{
public:
    int m_nError;
    CMyException(int nError = 3) 
    {
#ifdef _DEBUG
        m_bReadyForDelete = TRUE;
#endif
        m_nError = nError;
    }
    void Delete() {delete this;}
    int ReportError()
    {
        CString strText;
        strText.Format(_T("数字の %d が3に関係あるから、だめ!"), m_nError);
        AfxMessageBox(strText, MB_OK);
        return 0;
    }
};

//乱数発生処理
int NumberBut3()
{
    int iNum = rand();
    if (iNum % 3 == 0 && iNum != 0)
    {
        //3の倍数の時
        throw new CMyException(iNum);
    }
    return iNum;
}

void Test()
{
    for (int i = 0; i < 5; i ++)
    {
        try
        {
            int idat = NumberBut3();
            CString strMess;
            strMess.Format(_T("%d回目の数字は%dで、セーフ!"), i, idat);
            AfxMessageBox(strMess);
        }
        catch (CMyException* e)
        {
            e->ReportError();
            e->Delete();
            break;
        }
    }
}