0

さまざまなリソースから「C++ 例外処理」(EH) に関する文献を読んでいます。構文だけでなく概念も理解しました。しかし、より大きなスケールでは、私は混乱しています。

  1. それを完全に実行するコードを書きます。記述されたコードは、既知の特定の方法で実行されることが期待されます。コードの一部が例外をスローし、それが処理されてプログラムが実行を継続する場合。しかし、スローポイントからキャッチ関数まで、一部の関数が実行されませんでした。通常は実行されるはずですが、プログラムは完全に実行されていないため、さらに続行できます。

  2. EH がエラー回復に使用されることを示すステートメントに出くわしました。しかし、エラー回復が何を意味するか、特にC++ EHでどのように行われるかを確認するには、具体的な例が必要です。

4

4 に答える 4

1

例外がスローされると、例外がスローされた直後のポイントから実行が続行されません。むしろ、実行は、スローされた例外のタイプをキャッチできる「最も近い」1ブロックに戻されます。 catchそのcatchブロック内のコードが実行された後、通常どおり、その後に続くコードで実行が続行されます。それは(最終的に)例外がスローされたコードに戻る可能性がありますが、1)必ずしもそうではなく、2)そうである場合は、その時点までのコードを再実行するため、例外がスローされない場合(何らかの理由で) 次のコードは正常に実行されることが期待できます (もちろん、他のコードは例外セーフであり、プロセスで何も混乱していないと仮定します)。

例外 (またはそれ以外の場合は TBH) を使用したエラー処理の良い例を見つけるのは困難です。これは主に、EH を最初に使用するのと同じ理由でです。例外を適切に処理するコードは、多くの場合 (通常は?)、手元にあるアプリケーション。一部の小さなユーティリティなどでは、エラー メッセージを出力して終了する場合があります。何が起こっても実行し続ける必要があるサーバーの場合、ログに何かを書き込んでから実行を続けることがあります。


  1. ここでの「最も近い」は、ソース コード内の場所とは関係ありません。これは実行に基づいています。ブロック内のコードtryが実行されると、対応するcatchブロックがスタック スタイルでセットアップされます。catch例外がスローされると、スタックは、スローされた例外を処理できるブロックに到達するまでアンワインドされます。
于 2013-10-16T05:40:45.077 に答える
0

Note EH = Exception handling

We do EH to make sure that we do not get run time abnormal behavior of program, which can be due to some unexpected input/data at any point of execution or data corruption in processing. It depends on developer how he handles exception(s) i.e show any error message or correct the data and continue.

for example

class PlayGame{
private:
 /* variable */
public:
bool inputUserName() throw(){
   **** if user do not enter name throw exception
}
void play(){
********
}
void end(){
 ****
}
};

void game() throw(){
     PlayGame pg;
     pg.inputUserName();
     pg.play();
     pg.end();
}
void main(){
  /* one way of work */
  try{
     game()
  }catch (exception& e){
      cout<<"Error occour.. user name missing..\n";
  }

  /* second way can be */ 
try{
     game();
  }catch (exception& e){
     cout<<"Please enter name first...\n";
     game();
  }
}

This is good example of understanding EH in c++

于 2013-10-16T06:23:57.430 に答える
0

例外はセーフティ ネットですが、プログラマ エラー (セグメンテーション違反など) を処理するためのものではありません。

たとえば、まだ書き込まれていないディスク上のファイルを読み込もうとしているが、ある時点でそれが行われることがわかっているとします。クラッシュしてプロセス全体を燃やしますか? おそらくそうではありません。

ファイルがまだそこにないことを示す何らかの例外をキャッチした場合は、後で再試行するか、何らかのメッセージをログに記録することで、適切に処理できます。

于 2013-10-16T05:39:21.517 に答える
0

おそらく、「強力な例外安全性」の概念は、両方の質問に対する答えを提供します。例外安全性が高い関数は、通常どおりに完了するか、スローされた場合は、呼び出される前のプログラムの状態のままになります。

それが達成できるかどうかは今のところ無視して、コードが非常に例外的に安全な関数で構成されていると仮定しましょう。

  1. 明らかに、例外がキャッチされるたびに実行を継続できます。実行のための代替ルートがある時点でキャッチするだけです。最終的には、プログラムをまったく実行しないだけです。もちろん、実行の失敗は可能性として認めなければなりません。ただし、それ以外は完璧であり、やや非現実的です。
  2. Herb Sutter の「Exceptional C++」の本 ( http://www.gotw.ca/publications/xc++s.htmを参照) または彼の Guru-of-the-Week の投稿 ( http://www.gotw など) をお勧めします。 ca/gotw/059.htm

一般に、ここでの「エラー回復」とは、変更をロールバックすることを意味します。これは通常、すべてを暫定的に行うことによってのみ達成できます。成功が保証されるまで、コピーに。

その上で、エラー回復は、代替の実行ルートが存在する多くの場所でプログラムを設計するアーキテクチャ上の問題です。

于 2013-10-17T05:53:37.387 に答える