是否可以为GCC安装自定义处理程序?
我正在尝试将一个包装类抛出到指针(如shared_ptr),然后将其捕获。这实际上是我的Managed C ++ for GCC项目(在sourceforge上),但为了以更传统的C ++友好方式说明问题,我将在这个特定实例中使用boost :: shared_ptr。这就是我想要实现的目标。
void raise()
{
throw shared_ptr<DerivedException>(new DerivedException);
}
int main()
{
try
{
raise();
}
catch (shared_ptr<Exception> ex)
{
// Needs to catch DerivedException too!
}
}
关于这是否可以实现的任何想法?
答案 0 :(得分:0)
如果我理解正确,您可以在没有自定义异常处理程序的情况下在C ++中执行您想要的操作,但不能使用您正在使用的语法。我能看到的一个解决方案是将虚函数与异常机制结合起来。首先,创建一个基类,使捕获变得容易,并为其提供一个接口,以便轻松地重新抛出对象本身及其引用的对象。
struct shared_exception_base_t {
virtual void raise_ref() = 0;
virtual void raise_self() = 0;
};
template <class value_t>
class shared_ptr_t : public shared_exception_base_t {
value_t* ptr_;
public:
shared_ptr_t(value_t* const p) : ptr_ (p) { }
void raise_ref()
{
throw *ptr_;
}
void raise_self()
{
throw *this;
}
};
template <class value_t>
shared_ptr_t<value_t> mk_with_new()
{
return shared_ptr_t<value_t>(new value_t());
}
然后您可以使用异常机制进行区分。请注意,try / catch块必须嵌套。
#include <iostream>
struct file_exception_t { };
struct network_exception_t { };
struct nfs_exception_t : file_exception_t, network_exception_t { };
struct runtime_exception_t { };
void f()
{
throw mk_with_new<runtime_exception_t>();
}
int
main()
{
try {
try {
f();
} catch (shared_exception_base_t& x) {
try {
x.raise_ref();
} catch (network_exception_t& fx) {
std::cerr << "handling network exception\n";
} catch (file_exception_t& fx) {
std::cerr << "handling file exception\n";
} catch (...) {
x.raise_self();
}
}
} catch (...) {
std::cerr << "no idea\n";
}
return 0;
}