捕获并修改 std::exception 和子类,重新抛出相同的类型

Catch and modify std::exception and subclasses, rethrow same type

本文关键字:新抛出 类型 修改 std exception 子类      更新时间:2023-10-16

我想这样做:

try
{
  // ...
}
catch(const std::exception& ex)
{
  // should preserve ex' runtime type
  throw type_in_question(std::string("Custom message:") + ex.what());
}

这是否可能以某种方式不必为每个子类型编写单独的处理程序?

您要查找的内容可能是这样的:

try {
    // ...
}
template <typename Exc>
catch (Exc const& ex) {
    throw Exc(std::string("Custom message:") + ex.what());
}

至少我们通常C++是这样做这样的事情的。不幸的是,您不能在这样的 catch 块中编写模板代码。您能做的最好的事情就是将一些运行时类型信息添加为字符串:

try {
    // ...
}
catch (std::exception const& ex) {
    throw std::runtime_error(std::string("Custom message from ") +
                             typeid(ex).name() + ": " + ex.what());
}