mit*_*llJ 0 c++ 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;
}
Run Code Online (Sandbox Code Playgroud)
如果在对CreateDevice的调用中发生未处理的异常,在我们检查mhresult的结果之前程序不会崩溃吗?
是调用带有HResult返回值的方法,还是仅返回布尔值,这是否有所不同?
result = mEstablishHW();
if (!result)
{
return false;
}
Run Code Online (Sandbox Code Playgroud)
是否有其他方法可以提供强大的异常安全性而又不影响性能?
DirectX是基于COM的API。并且不允许异常跨越COM边界。因此,不存在任何DirectX函数。而是使用C样式的返回码(称为HRESULT)来指示错误。
为了有效地使用DirectX,显然,您至少应该学习COM的一些基础知识。但是,这里有一些技巧,可以使您的初始代码更安全并简化调试:
if/else
每次都写。编写一个宏来检查HRESULT
,在出现“ not S_OK
”的情况下中断调试器,并告诉您发生了什么文件,行和函数。您还可以将其转换HRESULT
为可读的字符串并输出(在控制台中)。NULL
“): ,,mswapChain
在你的榜样。mdevice
mdeviceContext
无论如何,DirectX并不是开始学习异常安全性的API。也许Standard库(如尝试为类编写适当的swap
函数)或Boost(如文件系统)在此方面会更好地工作。
归档时间: |
|
查看次数: |
1403 次 |
最近记录: |