Пользовательский обработчик исключений g ++

Можно ли установить пользовательский обработчик для GCC?

Я пытаюсь бросить класс-оболочку в указатель (например, shared_ptr), а затем поймать его ковариантно. Это на самом деле для моего проекта Managed C ++ для 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

Решение

Если я правильно понимаю, вы можете делать то, что вы хотите в 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;
}
0

Другие решения

Других решений пока нет …