5

Cleaner、よりエレガント、そして認識しにくいというタイトルの古いブログエントリで、著者は次のように述べています。

C++ では、 C++ 例外は実行中の特定の時点でのみ発生するため、それほど悪くはありません。C# では、いつでも例外を発生させることができます。

彼はそれによって正確に何を意味しますか?

4

4 に答える 4

4

まず、Raymond Chen が何かを混同していると非難するのを躊躇します。

throw彼は、C++ ではステートメントが存在する場合にのみ例外がスローされるということを意味しているのではないかと思います。コードとライブラリ関数を深く掘り下げる限り、どこから例外がスローされる可能性があるかを正確に判断できます。一方、C# では、ランタイム環境によっていつでも例外がスローされる可能性があります。たとえば、他のアセンブリの関数を呼び出そうとすると、セキュリティ例外が発生する可能性があります。

于 2012-06-14T08:34:07.753 に答える
3

別の言い方をすれば:

C++ では、nothrow 保証を提供する関数を作成できます。

私は C# を知りませんし、Raymond Chen も知っていると確信しているので、「C# ではいつでも例外を発生させることができる」という彼の主張を受け入れます。したがって、nothrow 保証を提供する関数を C# で記述することはできません。

C++ では、nothrow 関数は、他の例外保証を提供する関数の非常に重要なコンポーネントです。強力な保証を行う (つまり、トランザクションを実装する) には、通常、例外による中断なしに複数のステートメントを実行する、nothrow スワップのようなものが必要です。基本的な保証を行うには、nothrow リソースのクリーンアップが必要です。また、オブジェクトの状態がクラスの不変条件に違反しているコードの短い nothrow ストレッチも必要になる場合があります。

C++ で例外をスローする可能性のあるすべての「特定のポイント」を列挙するのは面倒かもしれませんが、実際には、例外をスローしない短いコードを書くことはそれほど難しくありません。C# でそれができない場合、それは重要な違いです。

C# に関する Chen の主張が間違っている場合、彼が何を言おうとしているのかはおそらく問題ではありません。彼は間違っているからです。

この記事をよく読んでみると、彼はほとんどの場合、サンプル コードが正しくない (実際のコードには明らかな影響がある) ことについて話していることに気付きました。したがって、彼の C# の主張が C# コードのいくつかの特殊なケースのために正しくなく、そのような C# コードがチュートリアルの例には決して現れない場合でも、彼は言語の教え方について重要な点を持っていることになります -- 例サンプルコードの例外を安全にするために必要な本質的なことを省いているのは、おそらく悪い例であり、悪い習慣を教えるリスクがあります. また、エラー コードの例とは異なり、生徒 (Chen 氏) は例が悪いことを一目で判断できないため、「悪くない」ものにするためにさらに作業が必要であることに気付かない可能性があります。

于 2012-06-14T09:03:03.280 に答える
2

彼は非同期例外について話していると思います.C#では、別のスレッドで何かが発生したために、あるスレッドで発生する可能性があります. (Chen のブログ エントリのコメント投稿者の 1 人は、彼が書いた内容を同じように解釈していることに注意してください。残念ながら、Chen はそれに応答していません。)

たとえば、あるスレッドAbortが別のスレッドを表すオブジェクトのメソッドを呼び出し、その別のスレッドにThreadAbortException.

于 2012-06-14T08:34:00.820 に答える
0

彼はおそらく、C ++では例外がフレームワークによってスローされるのではなく、あなたのコード(または自分のコードを「自分のコード」と見なした人々によって書かれた外部コード)からのみスローされることを意味します。C#では、フレームワークでも例外が発生する可能性があります。

しかし、私が理解していないのは、ライターが自分のコードからのみ例外を発生させることを好むように見える理由です。

于 2012-06-14T08:32:15.370 に答える