7

次のコードでは、最初の繰り返しで例外が発生し、2 回目の繰り返しでセグメンテーション違反が発生し、エラー メッセージは表示されません。例外がキャッチされていないようです:

int i = 0;
while(i++ < 10)
{
   try {
      cout << "Iteration: " << i << endl;
      // Code...
      cout << "OK" << endl;
   }
   catch(...)
   {
      cerr << "Error message" << endl;
      continue;
   }
}

Output:
Iteration 1
Error message
Iteration 2
Segmentation fault

それは正常ですか、それとも何か本当に問題が起こっているのでしょうか?

関連する場合は、そのコード ブロックで MySQL 接続をリセットし、接続が閉じているかどうかを確認すると例外が生成されます。

ありがとう。


プラットフォーム:
Linux - OpenSuse 11.4
C++ - GCC 4.5.1
Intel Xeon

4

3 に答える 3

20

segfaults はソフトウェアによって (直接) 引き起こされるのではなく、無効なメモリにアクセスしようとしている (または無効な方法でメモリにアクセスしようとしている - たとえば、書き込み保護されているメモリへの書き込み、そうでないメモリの実行など) ことを検出するプロセッサによって引き起こされるためです。実行されるはずの t など)、try/catch例外をスローするソフトウェアをキャッチするように設計された で「キャッチ可能」ではありません。どちらも例外と呼ばれますが、システムのソフトウェア/ハードウェアの異なるレベルで発生します。

技術的には、 のシグナル ハンドラーを使用してセグメンテーション違反をキャッチできますSIGSEGV。ただし、Ivaylo が説明しているように、通常、セグメンテーション違反が発生した場合に「再試行」することは許可されていません。のシグナル ハンドラはorSIGSEGVが許可されていますが、単に返されるべきではありません。longjmpexit

シグナルの詳細については、http: //www.alexonlinux.com/signal-handling-in-linuxをご覧ください。

典型的な C++ 例外 ( の結果throw) は問題なく再試行できます (もちろん、同じ例外が再度スローされる可能性もあります。

于 2013-02-15T17:33:56.293 に答える
5

そのようなセグメンテーション違反をキャッチすることはできません。通常、このエラーは回復不能であり、通常の try-catch では処理されません。これは、おそらくスタックの破損など、何かが非常にうまくいかなかったことを意味します。valgrindを使用して、セグメンテーション違反の原因を検出してみてください。

于 2013-02-15T17:09:41.963 に答える
1

catch句は、式によってスローされる例外をキャッチしますthrow。標準のC++(およびすべての正常なC ++実装)では、オペレーティングシステムまたはハードウェアによって検出されたエラーをキャッチしません。そうしないと、例外安全なコードを書くのが非常に難しくなります。

于 2013-02-15T17:28:30.740 に答える