我正在尝试实现自定义类异常。
异常本身有效,但我收到了损坏的输出
#include <stdexcept>
namespace Exception{
class LibraryException : public std::runtime_error
{
public:
explicit LibraryException(const std::string& message)
: std::runtime_error(""),
prefix_("LibraryException: "),
message_(message)
{
}
const char* what() const noexcept override
{
std::string out;
out += prefix_;
out += message_;
return out.c_str();
}
private:
std::string prefix_;
std::string message_;
};
class BadSizeException : public LibraryException
{
public:
explicit BadSizeException() : LibraryException("Library: Bad Size\n")
{
}
};
}
当我尝试引发异常时的输出:
°áó°áóxception:Bad Size
我做错了什么?
答案 0 :(得分:4)
我做错了什么?
您正在返回指向临时对象的指针。
##fileformat=VCFv4.2
##fileDate=20180425
##source="Stacks v1.45"
##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
##INFO=<ID=AF,Number=.,Type=Float,Description="Allele Frequency">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
##FORMAT=<ID=AD,Number=1,Type=Integer,Description="Allele Depth">
##FORMAT=<ID=GL,Number=.,Type=Float,Description="Genotype Likelihood">
##INFO=<ID=locori,Number=1,Type=Character,Description="Orientation the
corresponding Stacks locus aligns in">
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT
CHALIFOUR_2003_ChHis-1 CHALIFOUR_2003_ChHis-13 CHALIFOUR_2003_ChHis-14
CHALIFOUR_2003_ChHis-15
un 1027 13_65 C T . PASS NS=69;AF=0.188;locori=p GT:DP:AD
0/1:16:9,7 0/0:39:39,0 0/0:17:17,0 0/0:39:39,0
从 const char* what() const noexcept override
{
std::string out;
out += prefix_;
out += message_;
return out.c_str();
}
返回的指针仅在out.c_str()
有效时才有效。
要解决此问题,您需要在与异常具有相同生命周期的字符串上调用out
,例如成员变量。
答案 1 :(得分:2)
正如Drew所说,你在其范围之外使用了本地对象指针。可能的解决方案。
class LibraryException : public std::runtime_error
{
public:
explicit LibraryException(const std::string& message)
: std::runtime_error(""),
prefix_("LibraryException: "),
message_(message)
{
}
const char* what() const noexcept override
{
buffer_ = prefix_ + message_;
return buffer_.c_str();
}
private:
std::string prefix_;
std::string message_;
mutable std::string buffer_; // Now buffer will live between what() calls.
};
mutable
是因为what()
的常量。这样您就可以更改buffer_
。