0

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!
    }
}

これが達成可能かどうかについてのアイデアはありますか?

4

1 に答える 1

0

私が正しく理解していれば、カスタム例外ハンドラーなしで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;
}
于 2012-12-17T22:15:43.590 に答える