DirectX Exception handling

坚强是说给别人听的谎言 提交于 2020-01-06 16:46:06

问题


I'm following the rastertek tutorial on DirectX while also studying Exception-Safety in Generic Components by David Abrahams (http://www.boost.org/community/exception_safety.html).

Why (to the best of anyone's knowledge) is the exception handling set up the way it is in the rastertek tutorial and what level of protection does it offer?

For instance:

mhresult = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, &mfeatureLevel, 1,
    D3D11_SDK_VERSION, &mswapChainDesc, &mswapChain, &mdevice, NULL, &mdeviceContext);

if (FAILED(mhresult))
{
    return false;
}

if an unhandled exception occurs in the call to CreateDevice won't the program crash before we check the result of mhresult?

Does it make a difference whether we're calling a method with an HResult return value or just a boolean?

result = mEstablishHW();
if (!result)
{
    return false;
}

Is there an alternative approach that would provide strong exception safety without a performance impact?


回答1:


DirectX is a COM-based API. And exceptions are not allowed to cross COM boundary. So no DirectX function exists that ever throw. Instead, they use C-style return codes, which are called HRESULT, to indicate errors.

To effectively work with DirectX, obviously you should learn at least some basics of COM. But here are tips to start with, to make your initial code safer and to simplify debugging:

  • Always always always check return code. It doesn't mean you should write if/else each time. Write a macro that will check HRESULT, break a debugger in case of "not S_OK", and tell you a file, line and function where it happened. You could also convert HRESULT to readable string and output it (in console).
  • It is a good idea, to check output objects if they are valid (i.e. not "NULL"): mswapChain, mdevice, mdeviceContext in your example.
  • Use DirectX debug layer: D3D11_CREATE_DEVICE_DEBUG
  • Use Graphics diagnostics tools: one is built into Visual Studio since 2012, Nvidia Nsight is very good too
  • Finally, read the docs! MSDN isn't perfect, but DirectX docs are pretty well-written.

Anyway, DirectX is not the API to start to learn exception safety. Maybe Standard library (like trying to write proper swap function for your classes) or Boost (like filesystem) will work better for that purpose.




回答2:


DirectX doesn't use exceptions to report errors or anything else. The DirectX interfaces are meant to be compiler agnostic and using C++ exceptions would tie their use to a specific compiler because of ABI differences. Even different versions Microsoft C++ would be incompatible because of ABI differences.

Since most DirectX methods and functions return an HRESULT value, you'll want to check for errors like in your first example. You can then throw an exception in your own code if that makes sense for your project.



来源:https://stackoverflow.com/questions/25714503/directx-exception-handling

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!