【发布时间】:2019-06-07 20:07:10
【问题描述】:
我正在维护相当旧的遗留代码。我的先驱者是异常处理领域的先驱(
他们实现了一种很好的投掷方式:
TL_THROW_EXCEPTION(ISQL_MSG_XML_PARSER_ERROR) << msg;
TL_THROW_EXCEPTION 扩展为:
TLThrowTec::CTLThrowExceptionTechnical::ThrowT(__FILE__,__LINE__,
ISQL_MSG_XML_PARSER_ERROR) << msg;
它在堆栈上创建一个 TLThrowTec::CTLThrowExceptionTechnical 实例,并使用移位操作来设置消息字符串。析构函数创建并抛出异常。
stackoverflow 中的一个 2008 年条目解释了那一年的状态: throwing exceptions out of a destructor 那时它似乎已经奏效了。
但现在 Visual Studio 17 允许投掷,但不再允许捕捉。
由于遗留代码是整个系统的一部分,它会生成日志文件条目,例如“未处理的操作系统异常”。
我想在不对源代码进行太多更改的情况下恢复捕获逻辑。最好为 TL_THROW_EXCEPTION 提供#define。
有没有办法重新定义宏,以便在消息中抛出异常?
如果我搜索 TL_THROW_EXCEPTION 这是最后一行:
匹配行:770 匹配文件:217 搜索的总文件:3159
我不喜欢触摸所有这些。
【问题讨论】:
-
VS2017 运行时现在强制执行异常规范,就像它应该遵循语言规范一样。您只需要正确定义析构函数即可恢复遗留行为。所以,大致是
~CFoo() throw() { .... }。至少在他们强制执行 C++20 之前你会很好,那可能需要一段时间。 -
你能修改
ThrowT吗?
标签: c++ visual-c++