DirectX异常处理
DirectX Exception handling
我正在学习DirectX上的rastertek教程,同时学习David Abrahams的《通用组件中的异常安全》(http://www.boost.org/community/exception_safety.html)。
为什么(据任何人所知)异常处理是按照rastertek教程中的方式设置的,它提供了什么级别的保护?
例如:
mhresult = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, &mfeatureLevel, 1,
D3D11_SDK_VERSION, &mswapChainDesc, &mswapChain, &mdevice, NULL, &mdeviceContext);
if (FAILED(mhresult))
{
return false;
}
如果在对CreateDevice的调用中发生未处理的异常,在我们检查mhresult的结果之前,程序不会崩溃吗?
调用带有HResult返回值的方法还是只调用布尔值的方法有区别吗?
result = mEstablishHW();
if (!result)
{
return false;
}
是否有一种替代方法可以在不影响性能的情况下提供强大的异常安全性?
DirectX是一个基于COM的API。并且异常不允许跨越COM边界。因此,没有DirectX函数可以抛出。相反,它们使用C样式的返回代码(称为HRESULT)来指示错误。
为了有效地使用DirectX,显然你应该至少学习一些COM的基础知识。但这里有一些技巧可以从一开始,让你的初始代码更安全,并简化调试:
- 始终检查返回代码。这并不意味着你应该每次都写
if/else
。编写一个宏来检查HRESULT
,在"非S_OK
"的情况下中断调试器,并告诉您发生这种情况的文件、行和函数。您还可以将HRESULT
转换为可读字符串并输出(在控制台中) - 最好检查输出对象是否有效(即不是"
NULL
"):在您的示例中为mswapChain
、mdevice
、mdeviceContext
- 使用DirectX调试层:D3D11_CREATE_DEVICE_debug
- 使用图形诊断工具:一个自2012年以来内置在Visual Studio中,Nvidia Nsight也非常好
- 最后,阅读文档!MSDN并不完美,但是DirectX文档写得很好
无论如何,DirectX并不是开始学习异常安全性的API。也许标准库(比如尝试为类编写正确的swap
函数)或Boost(比如文件系统)会更好地实现这一目的。
由于大多数DirectX方法和函数都返回HRESULT
值,因此您需要像第一个示例中那样检查错误。然后,如果对您的项目有意义,您可以在自己的代码中抛出异常。
相关文章:
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 如何处理 DirectX 11 驱动程序崩溃
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- DirectX异常处理