Написал простенькое приложение на MFC. Что бы проверить можно ли поймать исключение. Ничего к сожалению не работает. Исключение вызова абстрактной функции проскакивает мимо обработчика и вываливается в окно ошибки CRT.
Вот код:
// CrashMFC1.cpp
#include "stdafx.h"
#include "CrashMFC1.h"
#include "CrashMFC1Dlg.h"
#include <Windows.h>
#include <Dbghelp.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CCrashMFC1App
BEGIN_MESSAGE_MAP(CCrashMFC1App, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
void myPurecallHandler(void)
{
throw; // Данный метод не вызывается, исключение пролетает мимо него, и выскакивает окошко CRT ошибки
}
void make_minidump(EXCEPTION_POINTERS* e)
{
... // здесь пишется крашдамп, но до выполнения этого метода к сожалению не доходит
}
LONG CALLBACK unhandled_handler(EXCEPTION_POINTERS* e)
{
make_minidump(e);
return EXCEPTION_CONTINUE_SEARCH;
}
CCrashMFC1App::CCrashMFC1App()
{
...
}
CCrashMFC1App theApp;
BOOL CCrashMFC1App::InitInstance()
{
...
//Видимо не самое удачное место для этих методов
_set_purecall_handler(myPurecallHandler);
SetUnhandledExceptionFilter(unhandled_handler);
return FALSE;
}
// CrashMFC1Dlg.cpp
#include "stdafx.h"
#include "CrashMFC1.h"
#include "CrashMFC1Dlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
class CAboutDlg : public CDialogEx
{
...
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
CCrashMFC1Dlg::CCrashMFC1Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CCrashMFC1Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCrashMFC1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CCrashMFC1Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CCrashMFC1Dlg::OnBnClickedButton1)
END_MESSAGE_MAP()
BOOL CCrashMFC1Dlg::OnInitDialog()
{
...
}
void CCrashMFC1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
...
}
void CCrashMFC1Dlg::OnPaint()
{
...
}
HCURSOR CCrashMFC1Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
class CDerived;
class CBase
{
public:
CBase(CDerived *derived): m_pDerived(derived) {};
~CBase();
virtual void function(void) = 0;
CDerived * m_pDerived;
};
class CDerived : public CBase
{
public:
CDerived() : CBase(this) {};
virtual void function(void) { };
};
CBase::~CBase()
{
m_pDerived -> function(); // Вызов абстрактного метода
}
void CCrashMFC1Dlg::OnBnClickedButton1()
{
CDerived myDerived;
}
К сожалению, не имею ни малейшего представления почему обработчик исключения не вызывается. И вообще должен ли он вызываться.
Буду очень благодарен за любую подсказку!