我想创建一个异常层次结构。我使用了 C++ 成语“多态异常”。
困难的一点是我希望这些类从 std::exception 派生 - 能够使用 try ... catch(exception &e) 在代码的任何点捕获任何异常。
但是,无论异常来自 std::exception 还是来自我的用户定义的异常,我都想以不同的方式处理异常。
这建议使用多态性,但是我无法在 std::exception 上定义虚函数。
我也尝试过使用函数模板(参见下面的代码),但它不起作用,因为调用的模板函数是在编译时确定的。
#include <iostream>
#include <string>
using namespace std;
#include <boost\type_traits\is_base_of.hpp>
#include <boost\utility\enable_if.hpp>
class BaseError :public exception {
public:
virtual void raise(){throw *this;}
virtual string msg (){ return "This is the base class"; }
};
class DerivedError: public BaseError {
public:
void raise(){throw *this;}
string msg (){ return "This is the derived class"; }
};
template <typename T>
typename boost::disable_if<boost::is_base_of<BaseError, T>>::type
handleException(T &e)
{
cout << "Handling generic exception" << endl;
cout << e.what() << endl;
}
template <typename T>
typename boost::enable_if<boost::is_base_of<BaseError, T>>::type
handleException(T &e)
{
cout << "Handling specific exception" << endl;
cout << e.msg() << endl;
}
int main () {
BaseError b;
handleException(b);
// prints "Handling specific exception"
// prints "This is the base class"
try{
throw exception("Exception !!!");
}
catch (exception &e){
handleException(e);
// prints "Handling generic exception"
// prints "Exception !!!"
}
try{
BaseError b;
b.raise();
}
catch (exception &e){
handleException(e);
// prints "Handling generic exception" - I would like the specific behaviour
// prints "Unknown exception"
}
try{
DerivedError d;
d.raise();
}
catch (exception &e)
{
handleException(e);
// prints "Handling generic exception" - I would like the specific behaviour
// prints "Unknown exception"
}
return 0;
}
知道如何实现这一目标吗?
提前致谢!