如何将C++98的动态异常规范正确移植到C++17
解决C++17编译动态异常规格报错的最小改动方案
问题根源
C17彻底移除了C98的动态异常规格(即函数声明后的throw(...)语法),所以代码里EventId(unsigned long Header) throw (std::string)会触发编译错误。
最小改动步骤
直接删掉函数声明后的throw (std::string)即可,这是侵入性最小的修改,完全不会改变原代码的运行逻辑。
修改前代码
static inline unsigned int EventId(unsigned long Header) throw (std::string) { if (!isTDCHeader(Header) && !isTDCTrailer(Header)) { throw std::string("CAENV1x90Data::EventId - not a tdc header"); } else { return ((Header & EVENTID_MASK) >> EVENTID_RSHIFT); } }
修改后代码
static inline unsigned int EventId(unsigned long Header) { if (!isTDCHeader(Header) && !isTDCTrailer(Header)) { throw std::string("CAENV1x90Data::EventId - not a tdc header"); } else { return ((Header & EVENTID_MASK) >> EVENTID_RSHIFT); } }
补充说明
- 从C11开始,动态异常规格就被标记为过时,C17直接将其从标准中移除;
- 移除
throw(std::string)后,函数依然会在不符合条件时抛出std::string异常,原有的错误处理逻辑不受任何影响; - 如果需要显式声明函数可能抛出异常(非强制要求),C++11及以后可使用
noexcept(false)替代,但你的场景下无需额外添加,保持代码最简即可。
内容的提问来源于stack exchange,提问作者Michele Peresano
相关产品推荐
相关产品推荐

