我想使用一个异常层次结构,其中基本异常类派生自boost::exception
,以便我可以获得该类必须提供的好的和有用的诊断信息和 {{1所以我可以跨线程抛出异常。
因此,我的基本异常类看起来像:
QtConcurrent::Exception
根据class MyException : public QtConcurrent::Exception, public boost::exception
{
public:
MyException() { };
virtual ~MyException() throw() { }
// required by QtConcurrent::Exception to be implemented
virtual void raise() const { throw *this; }
virtual MyException* clone() const { return new MyException(*this); }
};
的文档,QtConcurrent::Exception
和raise()
必须在从clone()
派生的任何类中实现。因此,我的其余代码可能类似于:
QtConcurrent::Exception
但是,使用void foo()
{
BOOST_THROW_EXCEPTION(MyException());
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
try
{
foo();
}
catch (const MyException& me)
{
std::cerr << boost::diagnostic_information(me);
}
return 0;
}
宏会导致以下编译错误:
错误C2555:'boost :: exception_detail :: clone_impl :: clone': 覆盖虚函数返回类型不同且不协变 来自'MyException :: clone'
我不完全确定这个错误告诉我的是什么(我的错,不是错误,我确定!)。
如果我改为使用BOOST_THROW_EXCEPTION()
代码编译就好了。正如我上面提到的,我想使用throw MyException();
以便在我的异常中获取诊断信息。
我知道一个可能的解决方法可能是另一个派生自BOOST_THROW_EXCEPTION()
的类,它有一个boost :: exception成员,本质上是实际错误的容器。但是如果可能的话,我希望继续QtConcurrent::Exception
继承MyException
和boost :: exception。
有人可以提供一些有关错误说明内容的见解吗?有什么方法可以实现我想要的吗?