最初の免責事項: これは「言語戦争」を引き起こすためのものではありません。私は自分のレポートのためにこれ (主題に関する明確化) が本当に必要であり、有効で確固たる議論をしたいだけです.
わかりましたので、ここで質問があります
。C++ では、良いことよりも悪いことを引き起こすと考えられていたため、C++ 11 標準から例外仕様が削除されました。
一方、Java では、例外仕様は何か良いものと見なされています。
これらの 2 つの概念 (例外仕様を持つ目的) は、これら 2 つの言語で異なりますか? そのため、これらの 2 つのコミュニティで異なるように見られているのですか、またはそれらの概念は類似/同一ですか?
どちらですか?例外指定は良いことですか、それとも悪いことですか? または、Java では良いので (ここでいくつかの理由を見たいと思います)、C++ で悪いのは (理由はここにある) からです。
建設的な助けをしてくれた人に感謝します。
4 に答える
他のことは別として、Java と C++ の例外仕様の主な違いは、Java では仕様が関数型の一部であり、チェック済み例外が関数の一部でない限り関数をエスケープできないようにコンパイラが強制することだと思います。関数のタイプの。
したがって、Java のチェック済み例外は、どの関数によってどの例外がスローされたかを追跡する限定的/欠陥のある手段を提供していました。C++ 例外仕様は、関数への呼び出しが特定の例外 (または任意の例外) をスローするのを防止する限定的/欠陥のある手段を提供します。
目的が異なるため、それぞれの成功または失敗を個別に評価する必要があります。実際のプログラマーがそれらを使用しない限り、どちらもある程度失敗したと言っても過言ではありませんが、両方について同じ方法で評価できるのはそれだけです。その程度は、Java ではかなり高く、C++ では非常に高くなります。それらが持っていた有益な用途、したがって各言語での正確な成功の程度は異なります.
Java と C++ の例外仕様は、まったく異なる方法で機能しています。
これは、C++ の観点から非常に優れた情報源です。http://www.gotw.ca/publications/mill22.htm
C++ 設計の主な欠点は、予期しない例外をスローすると、プログラムがクラッシュする可能性が非常に高いという事実でした (詳細についてはリンクを参照してください)。したがって、例外仕様は適用が遅すぎるという制約です。
Herb Sutter は次のように言って記事を閉じます。
Moral #1: Never write an exception specification. Moral #2: Except possibly an empty one, but if I were you I’d avoid even that.
Java 例外仕様フレームワークは異なります。チェック済み (コンパイル時) と実行時例外 (例外仕様のない C++ によく似ています) の 2 種類の例外があります。
チェックされた例外を使用すると、コンパイラは開発者にそれらを処理するように強制します。そうしないと、アプリケーションはコンパイルされません。これは便利ですが、実行時例外とチェック例外の違いは完全には明確ではなく、開発者に依存するため、混乱を招く可能性があります。また、チェックされた例外は、単純なプログラムのイディオムでも難しい判断を伴います (たとえば、チェックされた例外の仕様と戦略パターン)。
最終的な結果は、いつものように明確な言語機能がなく、使い方がまずかった。たとえば、C# の設計者はそれらを削除することにしました。
この特定のトピックについては、Java 設計の方が C++03 よりも優れていると思います (そして私は C++ の大ファンです)。なぜなら、開発者はよりわかりやすい方法でより良いコードを書くことができるからです。ただし、開発チーム内で一貫したコードを作成するには、エネルギー (コーディング標準とコード レビュー) を費やす必要があります。