2

例外へのポインタをスローするのは悪いことです。

try
{
    ...
    throw new MyExceptionClass();
}
catch (MyExceptionClass* e)
{
    ...
}

レガシーコードでキャッチターゲットをクリーンアップするためのあなたのアプローチは何ですか?operator newプライベートにすることで最初の部分を修正できると思います。

class MyExceptionClass
{
public:
    ...
private:
    void* operator new(size_t);
}

コンパイル時に同じように醜いものをキャッチするにはどうすればよいですか?catch (...)私はこれをただ領土に陥らせたくありません。

4

5 に答える 5

3

静的分析ツールやコードレビューを除けば、ポインターによるキャッチを防ぐためにできることは何もありません。MyExceptionClassただし、ポインタをスローすることをほぼ不可能にすると、catch(MyExceptionClass*)ブロックはデッドコードになります。

ポインタによるスローをより完全に防ぐには、実際にはさらにいくつかの作業を行う必要があります。

newのすべての形式の演算子を非表示にします-ここ を参照してください。

address-of演算子を非表示にする-以前に割り当てられたオブジェクトのアドレスをスローすると、ヒープに割り当てられたオブジェクトをスローするのと同じ問題が発生します。

class MyExceptionClass
{
private:
    MyExceptionClass* operator&();
}
于 2009-06-09T22:31:02.733 に答える
2

私があなたを正しく理解しているなら、あなたは悪い習慣をコンパイルエラーに変えたいと思うでしょう。

例外タイプをヒープ割り当て不可にすることで、これを違法にすることができました。

throw new MyExceptionClass();

残念ながら、次の部分はあなたが望むように行うことはできません。キャッチブロックを違法にする方法はありません。ただし、MyExceptionClassをヒープに割り当てることを違法にした場合は、キャッチブロックについて心配する必要はありません。無駄なスペースになります。

ポインタでキャッチしないように強制したい場合は、糸くずのようなツールが必要です。EDoC++を見ることをお勧めします。これは、適切な例外の使用法をチェックするために変更されたgccコンパイラです。

于 2009-06-09T20:26:30.253 に答える
1

ポインタによるスローのすべてのインスタンスを値によるスローに変更できるようにしたいようです。あなたはポインターによる投げを防ぐために実行可能な恨みを持っています。しかし、すべてのスローが変更された後、誤ってポインターをキャッチするのを防ぐ方法を探しています。

私の知る限り、これは言語によって強制することはできません。しかし、インスタンスを探すための単純なsedスクリプトで/catch (.* \*/十分だと思います...

于 2009-06-09T18:31:22.233 に答える
0

私は通常

試す
{{
  MyException();をスローします。
}
catch(const MyException&e)
{{
}

よくわかりませんが、あなたの質問は正しく理解しています。

于 2009-06-09T18:23:33.617 に答える
0

C ++言語規則に関する限り、それらへのポインターを完全に合法にするタイプへのポインターを禁止することはできません(ただし醜いです)。catch(T*)すべてのブロックを検索し、それらを変更するだけの簡単なツールを作成します。

operator newグローバルなnew演算子がまだ呼び出される可能性があるため、プライベートにすることは機能しない可能性があります。レガシーコードベースに動的割り当ての破損を強制するために提案するのは、MyExceptionClass-のコンストラクターのシグネチャを変更するか、デフォルトのコンストラクターに静的アサーションを追加してコンパイルの失敗を強制し、これらのデフォルトの場所を特定できるようにすることです-構築されたMyExceptionClass型がインスタンス化されます。

throw new私が取るもう1つのアプローチは、' '句を探して、それらを修正することです。

于 2009-06-09T18:27:49.290 に答える