自定义异常中的邮件已损坏

时间:2018-05-02 16:24:21

标签: c++ string c++11 exception

我正在尝试实现自定义类异常。

异常本身有效,但我收到了损坏的输出

#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

我做错了什么?

2 个答案:

答案 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_

的值