10

私は、特定の場合にプログラムでエラーまたはクラッシュが発生した場合に備えて、例外処理に使用されることtryを理解しています。catch()また、それらがどのように機能するかを理解しています。しかし、なぜ使用するtrycatch()ですか?if()特定のケースを探すステートメントを使用しないのはなぜcout << //error codeですか。そのケースが当てはまる場合は、そうします。

4

5 に答える 5

13

例外処理:

  • 別のエラーコードを返す機会がないコンストラクターとオペレーターで使用できます (オブジェクトを何らかのエラー状態に設定する可能性があります。これは、さらにメモリを使用することを意味しますが、クライアントコードも後でそのエラー状態をチェックすることを覚えておく必要があります)。
    • 例: ユーザー定義型 - クラスX- 表記法をサポートx1 = x2 + x3- エラー コードはどこで返されますか?
  • 特定のクラス/構造体のデータ メンバーがイニシャライザ リストで構築されるときに開始できます。これにより、破滅的または無駄になる可能性のあるさらなるデータ メンバーの構築を回避できます。対照的に、明示的なエラー処理は、コンストラクター本体の後半でのみ可能です。
  • より暗黙的 - コードの通常の成功フローを強調することで、より簡潔で読みやすく、保守しやすくすることができます
  • 異なる要因に分解されます - 多くの場所からの例外を 1 か所でキャッチできます。これにより、エラー処理コード自体がより簡潔になり、読みやすく、保守しやすくなる場合があります。
  • 簡潔な利点は、そうでなければエラー処理が繰り返される場合に、より信頼性の高いエラー処理に実際につながる可能性があります
  • 通常、ローカル変数、関数パラメーター、CPU レジスターの保存、戻りアドレスなどに使用されるスタックとは関係なく、独自のメモリ領域を使用します。これは、throw ステートメントが、残りのスタック メモリが例外オブジェクトよりも小さい場合でも、例外オブジェクトをそのメモリ領域に直接確実に構築できる可能性があることを意味します (ただし、実装の詳細であり、標準では保証されていません)。
  • パフォーマンス プロファイルが異なるため、特定の状況ではどちらも高速になる可能性があります。
  • 低レベル コードから中間コードまでのより豊富なエラー情報の伝達を容易にします。これらのコードは、C スタイルのエラー コードを伝達するために "所有" したり、変更したくない/できない場合があります。
于 2013-02-14T02:27:10.403 に答える
5

try...catchより多くのことを行います。が入力されてから自動的に割り当てられたすべてのオブジェクトのデストラクタを呼び出すスタックを巻き戻しますtry。提案された方法で行うと、これらのオブジェクトを手動で追跡する必要があります。そうしないと、メモリの問題 (リーク、上書き、古いポインター、二重削除) が発生します。

于 2013-02-14T02:22:05.200 に答える
1

もう 1 つの理由は、あなたが書いたコードが、他の誰かによってより大きなプロジェクトの一部として使用される可能性があることです。また、組み込みの例外処理ルーチンを使用することが標準であるため、より大きなプロジェクトのメンテナーは、例外処理を上位レベルで適切に実行できるように、例外を同様に処理することを期待しています。エラー出力として出力することは疑わしい慣行です (たとえば、抑制されるか、まったく使用されない可能性があります)。

UPD: あなたの質問を少し誤解しました。try...catch私が説明した理由は、実際にはブロックを使用せずに手動で例外をスローすることを正当化します。

于 2013-02-14T02:41:26.620 に答える
-2

私のヒーローの 1 人で、ZeroMQ で有名な Martin Sústrik の言葉を引用してお答えします。

ただし、未定義の動作が発生しないことを保証することが目標である場合、単純な障害を回避するための優れた機能は悪夢になります。例外の発生とその処理の間の分離により、C++ での失敗の回避が非常に簡単になり、プログラムが未定義の動作を決して実行しないことを保証することは事実上不可能になります。

そして、追加しますが、何よりも、非常に高度な再起動レイヤーに try/catch を使用していることに気付きました。加えて、私の意見は本当に重要ではありません。例外処理を使用する方法と理由の背後にある選択は、青よりも緑を好むという選択に非常に似ていると私は信じています。個人的なものであり、他人からの意見がそれを変える可能性は決してありません.

于 2013-02-14T02:35:01.780 に答える
-2

この質問は誤った二分法を提起しています。Java および C# では、try失敗時のクリーンアップでcatchと競合します。C++ では、失敗時のクリーンアップでif競合するのは主に RAII 手法 (デストラクタと単一フェーズの構築を使用) です。if

質問が例外の使用ifと .

于 2013-02-14T02:45:09.527 に答える