Итак, я написал класс исключений и хотел проверить его, вставив такую ошибку:
DXGI_SWAP_CHAIN_DESC sd{};
sd.BufferDesc.Width = 0;
sd.BufferDesc.Height = 0;
sd.BufferDesc.RefreshRate.Denominator = 0;
sd.BufferDesc.RefreshRate.Numerator = 0;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.BufferCount = 1;
sd.OutputWindow = (HWND)3092; //INTENTIONAL ERROR
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
sd.Flags = 0;
UINT swapCreateFlags = 0u;
#ifndef NDEBUG
swapCreateFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
HRESULT Hr;
Hr = D3D11CreateDeviceAndSwapChain(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
swapCreateFlags,
nullptr,
0u,
D3D11_SDK_VERSION,
&sd,
&pSwapChain,
&pDevice,
nullptr,
&pContext
);
if (FAILED(Hr))
{
throw GfxException(__LINE__, __FILE__, Hr);
}
и перехватив ее следующим образом (GfxException наследуется от класса Exception):
try
{
return App{}.Go();
}
catch (const Exception& e)
{
MessageBox(nullptr, e.what(), e.GetType().c_str(), MB_OK | MB_ICONEXCLAMATION);
}
catch (const std::exception& e)
{
MessageBox(nullptr, e.what(), "Standart exception", MB_OK | MB_ICONEXCLAMATION);
}
catch (...)
{
MessageBox(nullptr, "No details available", "Unknown exception", MB_OK | MB_ICONEXCLAMATION);
}
Я ожидал получить красивое окно сообщения со всей необходимой информацией об ошибке, и в выходных данных отладки также говорится, что GfxException был вызван, но по какой-то причине, которую я не смог понять, "throw" просто вызывает abort ивыводит это вместо моего сообщения:
Debug Error!
Program: ...DirectX3D11\Learning_Direct3D11\Debug\Learning_Direct3D11.exe
abort() has been called