web-dev-qa-db-ja.com

例外がマネージ(C#およびJava)言語で頻繁に使用され、C ++では使用されない理由は何ですか?

AFAIK、多くのC++プロジェクトは例外を許可せず、コーディングガイドラインでそれらを拒否します。たとえば、バイナリを別々の異なるコンパイラでコンパイルする必要がある場合、例外を正しく処理するのが難しいなど、多くの理由があります。

しかし、それは私を完全に納得させるわけではありません、ただ1つのコンパイラを使用している多くのプロジェクトがあります。 C++と比較して、C#およびJavaで例外が頻繁に使用されており、その理由は例外が十分な利点をもたらしていないことだけである可能性があります。

1つのポイントは、実際にはdebugbilityです。例外はC++コードではコールスタックを取得できませんが、C#およびJavaの場合、例外からコールスタックを取得できます。これは重要であり、デバッグを容易にします。コールスタックなしの障害ではありません例外は、言語の違いですが、例外の使用に影響します。

それでは、C++プログラムで例外が無視される理由は何ですか?

6
ZijingWu

C++の例外が頻繁に回避される主な理由は2つあります。

  • レガシーコード
  • 恐怖/不確実性/疑念(FUD)

例外では、自分で例外をスローしなくても、呼び出す関数は例外をスローする可能性があり、少なくともリソースをリークすることなく適切に処理できる必要があることを認識する必要があります。例外がC++で最初に導入されたとき、この認識は多くのC++開発者にはまだ存在していませんでした。さらに、既存のCコードの多くがC++に移植されており、C++ランタイム環境がメモリリークを回避するのに役立つ多くの支援を提供していないことを追加すると、例外安全ではないレガシーC++コードが大量に取得されます。 。

例外安全なコードを書く方法についての最初の認識の欠如は、多くの恐怖、不確実性、疑いも引き起こします。例外は、使い慣れたフロー制御メカニズムとは非常に異なって機能するため、堅牢なアプリケーションを作成するための多くの一般的な知恵が批判的でなければならないためです再評価。

C#およびJavaの場合、これらの問題は存在しません。これらの言語は、例外がすでに十分に理解されている場合にのみ使用されるため、ガベージコレクションがあり、大事なリソースが1つあります。それは注意深く、彼らは例外的なレガシーコードを持っていません。

Google C++スタイルガイドライン と言う:

例外は使用しません。

その guide には、C++の例外の賛否両論のリストと、なぜそれらを使用しないことにしたかについての議論があります。これらはグーグル起源のプロジェクトだけでなく、多くのプロジェクトに当てはまると思います。

基本的に、その理由は「レガシーコードとの互換性」です。

6
Wilbert

多くのC++プロジェクトは例外を許可せず、コーディングガイドラインでそれらを拒否します

無知だと思います。彼らは例外の意味を理解しておらず、スタックをほどくのにかかる時間も測定しています。

例外は十分な利益をもたらしていません。

例外の代替は一種のスパゲッティコードであり、複雑さが大幅に増加します。これは、時間/労力/お金に直接変換されます。

たとえば、オブジェクトの構築が失敗した場合はどうしますか?

Cプログラムに例外を追加するだけで(C++からは何も追加しない)、複雑さが大幅に軽減されます。

例外はC++コードでコールスタックを取得できません

バックトレースを取得することは可能で、 この答え はそれを行う方法を示します。

2
BЈовић

実行可能な代替策がすぐに表示されない限り、C++コードで例外を使用しないことを選択した理由は、管理対象リソースのオーバーヘッドと通常のフローを壊すことでした。

http://ptgmedia.pearsoncmg.com/images/020163371x/supplements/exception_handling_article.html

上記のリンクの記事は、1994年のC++レポートでTom Cargillによって最初に公開されたものの複製です。

C++コードで適切に例外処理を行うのはもっと難しく、バグを見つけるのは非常に微妙です。トム・カーギルが書いているように

例外の使用の本当に難しい部分は、任意の例外がスローサイトからハンドラーに伝播し、途中でプログラムの他の部分に損傷を与えることなく安全に到達できるように、すべての介在コードを記述することです。

0
Wouter Simons