C++20格式的异常消息

im9ewurl  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(85)

类似于this question。需要使用类似printf的样式而不是字符串串连接或iostreams来抛出异常。使用C++ 20格式库:

throw std::runtime_error { 
    std::format("Critical error! Code {}: {}", errno, strerror(errno)) 
  };

字符串
但它不觉得符合人体工程学调用格式在所有例外与格式,它可以得到更好的?

bmp9r5qi

bmp9r5qi1#

是的,它可以!

#include <format>
#include <stdexcept>

class runtime_exc : public std::runtime_error
{
   public:
     template <class... Args>
     runtime_exc(std::format_string<Args...> what_arg_fmt, Args&&... args)
       : runtime_error { std::format(what_arg_fmt, args...) }
     {
        
     }
};

字符串
使用方法:

throw runtime_exc { "Critical error!" };          
  throw runtime_exc {                        
    "Critical error! Code {}: {}", errno, strerror(errno) 
  };


如果在运行时使用format汇编消息,则可以使用std::vformat。如果需要,您可以添加另一个构造函数,并将其作为第一个参数。请注意,std::format可以掷回。
编辑:巴里注解,无需移动格式字符串和转发参数。

相关问题