私が正しく理解していれば、カスタム例外ハンドラーなしでC ++でやりたいことを実行できますが、使用している構文では実行できません。私が見ることができる1つの解決策は、仮想関数を例外メカニズムと組み合わせるということです。まず、キャッチを簡単にするための基本クラスを作成し、オブジェクト自体とその参照オブジェクトを簡単に再スローできるようにするためのインターフェイスを提供します。
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;
}