Когда я выбрасываю исключение, а не ловлю его, моя программа прерывается - PullRequest
0 голосов
/ 21 сентября 2019

Итак, я написал класс исключений и хотел проверить его, вставив такую ​​ошибку:

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
...