避免调用可能会引发析构函数的函数

问题描述 投票:1回答:1

我有一个ODBC包装器接口,使我能够在C ++中执行SQL查询。我特别用named parameter idiom为选择语句,例如:

Table.Select("foo").GroupBy("bar").OrderBy("baz");

为了实现此效果,类Table_t返回代理对象Select_t

class Table_t
{
// ...

public:
  Select_t Select(std::string const &Stmt)
    { return {*this, Stmt}; }

  void Execute(std::string const &Stmt);
};

Select_t将基本语句与附加子句结合在一起,并在析构函数中执行实际语句:

class Select_t
{
private:
  Table_t &Table;
  std::string  SelectStmt,
               OrderStmt,
               GroupStmt;

public:
  Select_t(Table_t &Table_, std::string const &SelectStmt) :
    Table(Table_), SelectStmt(SelectStmt_) {}

  ~Select_t()
    { /* Combine the statements */ Table.Execute(/* Combined statement */); }

  Select_t &OrderBy(std::string const &OrderStmt_)
    { OrderStmt = OrderStmt_; return *this; }

  Select_t &GroupBy(std::string const &GroupStmt_)
    { GroupStmt = GroupStmt_; return *this; }
};

问题是Table.Execute(Stmt)可能会抛出,而且我一定不能抛出析构函数。有没有我可以在保留命名参数惯用法的同时解决此问题的方法?

到目前为止,我想到的唯一想法是在Execute上添加Select_t函数,但我不想这样做:

Table.Select("foo").GroupBy("bar").OrderBy("baz").Execute();
c++ exception destructor
1个回答
3
投票

[扔进”一个析构函数不是问题;问题是析构函数逃脱了异常。您需要捕获ODBC异常,并决定如何通过另一个接口传达错误。

© www.soinside.com 2019 - 2024. All rights reserved.