COleDateTime::SetDateTime异常特性及函数noexcept标记合理性验证
问题解答
1. 关于SetDateTime不会抛出异常的推断是否正确
你的推断完全正确,SetDateTime确实不会抛出C++异常,原因如下:
- 该函数的定义签名明确带有
throw(),这是C03标准的异常规范,语义和C11及后续版本的noexcept完全一致,明确承诺不会抛出任何异常。 - 从你贴出的实现代码看,其调用链上的所有函数都没有抛出C++异常的逻辑:
- 内部调用的
AtlConvertSystemTimeToVariantTime里的ATLENSURE宏,在Release配置下仅做参数校验,失败直接返回错误不会抛异常;Debug配置下触发的是断言终止,不属于C++异常范畴,不会触发noexcept的异常逃逸终止逻辑。 - 最终调用的两个Win32系统API
SystemTimeToVariantTime、VariantTimeToSystemTime都仅通过返回值标识错误,不会抛出C++异常。
- 内部调用的
2. 函数标记为noexcept是否安全
你当前版本的GetSpecialEventDate标记noexcept是完全安全的。
你提到的“在if分支调用GetStatus会抛出异常”属于对文档的误解:GetStatus的定义签名同样带有throw(),本身也不会抛出异常,只会直接返回对象当前的状态枚举值,哪怕对象处于无效状态也不会抛出异常。就算你后续在错误处理分支添加GetStatus调用,只要不主动在分支内抛出异常,整个函数依然符合noexcept的要求。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

