You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:18:11