创建接收参数的新异常

时间:2015-10-07 21:28:54

标签: c++ exception

您好我正在尝试创建接收参数并将字符串发送到基类的新异常。

代码

class EmptyFunctionException : public std::runtime_error {
public:
    EmptyFunctionException(std::string filename, std::string funcname){
        std::stringstream ss;
        ss << filename << " " << funcname;
        std::runtime_error(ss.str());
    }
};

错误

  

基类'runtime_error'没有默认构造函数。

我知道我需要像那样发送它

EmptyFunctionException(std::string filename, std::string funcname)
  : std::runtime_error(...)

但是如何在此之前创建字符串?

感谢。

2 个答案:

答案 0 :(得分:1)

我会这么做,不是实际在构造函数中设置基本异常的what()消息,而是根据您的需要覆盖what()方法:

class EmptyFunctionException : public std::runtime_error {
public:
    EmptyFunctionException(const std::string filename&, const std::string& funcname
    : std::runtime_error(""), filename_(filename), funcname_() {
        std::stringstream ss;
        ss << filename << " " << funcname;
        msg_ = ss.str();
    }

    const char* what() const noexcept {
        return msg_.c_str();
    }

private:
    std::string filename_;
    std::string funcname_;
    std::string msg_;
};

由于what()在基础中被声明为virtual,并且它是受所需基本异常参数影响的唯一方法,因此最好覆盖它。

虽然,我会考虑,具体EmptyFunctionException的整个目的是什么?是否应该有一些特殊的逻辑来处理它超出runtime_error,或者只是为了进行错误消息格式化?

在后一种情况下,可以在抛出异常之前完成。

答案 1 :(得分:0)

如果你真的需要复杂的格式化而且简单连接不行,你可以随时拥有一个中级类:

class EmptyFunctionException : public std::runtime_error {
    struct ErrorFormatter {
        ErrorFormatter(const std::string& filename, const std::string funcname)             
        { 
             std::stringstream ss;
             ss << filename << " " << funcname;
             errstr = ss.str();
        }  
        const std::string& str() const { return errstr; }
        private:
        std::string errstr;
    };
public:
    EmptyFunctionException(std::string filename, std::string funcname) : 
        std::runtime_error(ErrorFormatter(filename, funcname).str()) {}
};