在异常消息中使用 constexpr

Posted

技术标签:

【中文标题】在异常消息中使用 constexpr【英文标题】:Use of constexpr in exception message 【发布时间】:2017-12-06 17:04:38 【问题描述】:

我试图,但这不起作用: 以下代码在 g++ 上编译良好(使用 c++11 或 c++14)。

#include <exception>

constexpr auto TEST = "test";

class test_throw : public std::exception 
public:
    virtual const char* what() const throw() 
        return (std::string("THROW ")+TEST).c_str();
    
;

int main()

    throw test_throw;
 

我想知道为什么我的异常输出的是空消息,好吧,这似乎是个坏把戏,但我不明白消息怎么会是空的。

有没有办法在不用宏替换 constexpr 的情况下实现这一点?

【问题讨论】:

小心,你的指针悬空了。 好的,现在就搞定。谢谢巴里。有没有办法实现我想做的事情? 你想做什么?我觉得你问的是你的解决方案中的一个障碍,而不是你的问题。 在构造时或使用可变成员将字符串存储在类的成员中。 【参考方案1】:

灾难在等待 - 这是 gcc 的警告:

<source>: In member function 'virtual const char* test_throw::what() const':
9 : <source>:9:51: warning: function returns address of local variable [-Wreturn-local-addr]
         return (std::string("THROW ")+TEST).c_str();

以下是一些确保安全的方法:

选项 1 - 源自更具体的标准异常,初始化 构造函数中的消息。

#include <stdexcept>
#include <string>

constexpr auto TEST = "test";

class test_throw : public std::runtime_error 

public:
    test_throw()
    : runtime_error(std::string("THROW ")+TEST)
    
;

选项 2 - 以 thread_safe 静态方式构造消息:

class test_throw : public std::exception 

public:
    const char* what() const noexcept
    
        thread_local static std::string message;

        try
        
            message = std::string("THROW ") + TEST;
            return message.c_str();
        
        catch(...)
        
            return "can't give you a message";
        
    
;

选项 3 - 重新发明***。

class test_throw : public std::exception 

    std::string message_;

public:
    test_throw()
    : message_  std::string("THROW ") + TEST 
    

    const char* what() const noexcept
    
        return message_.c_str();
    
;

【讨论】:

以上是关于在异常消息中使用 constexpr的主要内容,如果未能解决你的问题,请参考以下文章

如何从它的消息中分离异常类型

使用 xUnit 进行单元测试异常消息

如何在飞镖中向用户返回异常消息?

如何在 MySQL 5.5 中获取存储过程的异常消息

Spring-batch:如何在 Spring Batch 中使用 skip 方法捕获异常消息?

如何在 Ruby 中向异常消息中添加信息?