加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在包装C库的C类中抛出什么?

发布时间:2020-12-16 09:28:02 所属栏目:百科 来源:网络整理
导读:我必须围绕现有的C库创建一组包装C类. 对于C库的许多对象,构造是通过调用诸如britney_spears * create_britney_spears()和相反的函数void free_britney_spears(britney_spears * brit)来完成的. 如果britney_spears的分配失败,create_britney_spears()将返回
我必须围绕现有的C库创建一组包装C类.

对于C库的许多对象,构造是通过调用诸如britney_spears * create_britney_spears()和相反的函数void free_britney_spears(britney_spears * brit)来完成的.

如果britney_spears的分配失败,create_britney_spears()将返回NULL.

据我所知,这是一种非常常见的模式.

现在我想把它包装在一个C类中.

//britney_spears.hpp

class BritneySpears
{
  public:

    BritneySpears();

  private:

    boost::shared_ptr<britney_spears> m_britney_spears;
};

以下是实施:

// britney_spears.cpp

BritneySpears::BritneySpears() :
  m_britney_spears(create_britney_spears(),free_britney_spears)
{
  if (!m_britney_spears)
  {
    // Here I should throw something to abort the construction,but what ??!
  }
}

所以问题出在代码示例中:我应该抛弃什么来中止构造函数?

我知道我几乎可以扔任何东西,但我想知道通常做什么.我没有关于分配失败原因的其他信息.我应该创建自己的异常类吗?这种情况有例外情况吗?

非常感谢.

解决方法

您不希望派生BritneyFailedToConstruct异常.我的经验是你应该保持异常层次结构尽可能平坦(每个库使用一种类型).该异常应该来自std :: exception,并且应该以某种方式包含可通过std:; exceptions virtual what()函数访问的消息.然后将其抛出到构造函数中:

throw MyError( "failed to create spears object" );

以下是我在自己的实用程序库中使用的异常类的声明:

class Exception : public std::exception {

    public:

        Exception( const std::string & msg = "" );
        Exception( const std::string & msg,int line,const std::string & file );

        ~Exception() throw();

        const char *what() const throw();
        const std::string & Msg() const;

        int Line() const;
        const std::string & File() const;

    private:

        std::string mMsg,mFile;
        int mLine;
};

#define ATHROW( msg )
{   
    std::ostringstream os;  
    os << msg               
    throw ALib::Exception( os.str(),__LINE__,__FILE__  ); 
}   

该宏用于方便地添加文件名和行号,并为消息提供流格式.这可以让你说:

ATHROW( "britney construction failed - bad booty value of " << booty );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读