6

私は、、、および--と呼ばれるクラスを使用するように設計されたシステムに取り組んでいますerror_codeerror_condition新しいerror_categorystd:C ++ 11では、現在、実際にBoost実装を使用しています。Chris Kholkoffの一連の記事を3回読んだことがありますが、これらのクラスを一般的に作成する方法を理解していると思います。

私の問題は、このシステムが個々のDLLに存在するプラグインを処理する必要があり、プラグインがエラーを発行する可能性があることです。errno私の当初の設計では、さまざまなエラーコードすべてと、実際には値に対応していない特定のエラー条件の候補リストを含む1つのシステム固有のエラーカテゴリを計画していました。ここでの問題は、DLLがこれらのエラーコードの1つを使用できるようにするためerror_categoryに、アプリ内のの唯一のインスタンスにアクセスする必要があることです。私は今、SetErrorCategory()各DLLから関数をエクスポートすることでこれを処理しています。これは機能しますが、ちょっと厄介です。

私が見ている別の解決策は、各DLLに独自のエラーカテゴリとコードがあり、必要に応じて独自の条件があることです。これは、このライブラリ機能で想定されていたものに似ていると思います。ただし、これには、プラグインのエラースキームを認識し、プラグインのエラーに一致するアプリの条件を確認できる、メインアプリのエラースキームの比較関数が必要だと思います。これはさらに多くの問題を起こしやすいようですが、私はまだそれを実装しようとはしていません。実際のすべてのロジックに加えて、エラースキーム全体をDLLからエクスポートする必要があると思います。

もちろん、これを行う別の方法は、DLLからの数値エラーコードを使用して、アプリ側のエラーオブジェクトにそれらを詰め込むことです。プラグインが単純であるという利点がありますが、アプリで落とし穴が発生する可能性があります(たとえば、いくつかの異なるプラグインからオブジェクトをジャグリングする関数は、各エラーの原因に注意を払う必要があります)。

ですから、私の具体的な質問は、これら3つのオプションのうち、どれを使用しますか、そしてその理由は何ですか。明らかに実行不可能なのはどれですか?そしてもちろん、私には起こらなかったより良い方法はありますか?

4

2 に答える 2

2

この問題に取り組んでいるときに私が到達した解決策は、特定のタイプのエラーの継承とともに、問題のファミリーとユーザーサブコードの選択に事前定義されたコードを使用することでした。ブーストを使用すると、次の方法で特定のタイプを継承できます。

struct IOException : virtual std::exception, virtual boost::exception {};
struct EOFException : IOException {};
...

そして、IOExceptionのような事前定義された一般的なエラーと一致するエラーコードを残します。したがって、エラーの各ファミリの一般的なコード範囲を設定できます。

namespace exception { namespace code {
    UNKNOWN_EXCEPTION           = 0;
    IO_EXCEPTION                = 100;
    CONCURRENCY_EXCEPTION       = 200;
    ...
}}

次に、新しいエラータイプが必要な場合は、すでに定義されている一般的な例外タイプとそのエラーに付随するコードから継承し、継承タイプとマイナー値(0〜99)で例外を特殊化できます。これにより、try catchブロックでより具体的なエラータイプをキャッチしながら、より一般的なバージョンの例外を他の制御ブロックに渡すこともできます。その後、ユーザーは親の例外コードを自由に使用したり、ファミリ内にある独自のコードを指定したりできます(親=100->子=115)。ユーザーが新しいエラーファミリーを作成せずにIOErrorだけが必要な場合は、面倒なことなくデフォルトのファミリー例外を使用できます。これにより、ユーザーが望まないときに例外コードのOCD追跡を必要とせずに、ユーザーに柔軟性がもたらされることがわかりました。

しかし、個人的な好みがここでの私のデザインの選択を導いたので、これは決して最終的な解決策ではありません。エラーコードが多すぎると混乱を招き、例外の継承によってすでにこの情報がエンコードされていることがわかりました。実際、私が説明したシステムでは、エラーコードを完全に取り除き、例外の継承だけに依存するのは簡単ですが、多くの人は、各例外名にコードを割り当てることを好みます。

于 2012-08-29T01:15:35.750 に答える
2

別の解決策を見つけました。自分の実装のみを含むDLLを1つ作成error_categoryし、アプリおよび各プラグインDLLからそのDLLにリンクします。これにより、アプリからDLLにオブジェクトを明示的に渡すことなく、すべてのユーザーがグローバルカテゴリオブジェクトにアクセスできるようになります。

于 2012-09-14T22:40:46.197 に答える