2017-12-13 15 views
-2

呼び出される関数にthrow節がない場合、呼び出された関数から例外をキャッチすることができるかどうかを知りたいと思います。私のアプリケーションは、catchブロック内出力文をクラッシュするたびに理由fun2()、私のアプリケーションがクラッシュしたの、ここで呼び出された関数から例外をキャッチする方法

void thread11() 
{ 
    while(true) 
    { 
      try 
      { 
       ... 
       fun2() //static library function 
       ... 
      } 
      catch(std::exception& e) 
      { 
       std::cout << "exception is " << e.what() << std::endl; 
      } 
     } 
} 

を印刷されませんので、私はこの質問を求めていた理由です。これらの例外を呼び出し元関数で捕捉することは可能ですか?何throw句がない場合は、すべての例外を逃れることができます。

+6

C関数はC++例外をスローしません。また、C++の例外とハードウェアとその他のシステム例外との間にはクラッシュを引き起こす可能性のある違いがあります。 C++プログラムでは、C++の例外を捕捉することしかできません。 –

+0

私はあなたが 'catch(...) 'という構文について質問していると思いますが、わかりません。 – UKMonkey

+1

完全に異なる獣であるシステム例外とC++例外を混同していると思います。システム例外はOS固有のものなので、ここでもう少し詳しい情報を教えてください。 – Frank

答えて

1

は、あなただけの機能から逃れることができる例外のセットを制限されている機能の

try { fun2(); } 
catch (...) { std::cout << "an unknown exception was caught\n"; } 

throw句のようなものを使用して、すべてのC++の例外をキャッチすることができます。 throw句があり、異なる例外がスローされた場合、プログラムはstd::terminate()になります。

すべての例外をキャッチすると、例外の原因が示されません。意味のある唯一のアクションは、エラーを完全に飲み込んだり、(throw;を使用して)例外を再スローして、別の場所で処理されることです。

問題の説明は実際には例外ではないことを意味します(C関数は例外をスローすることはできません)が、信号に遭遇しました.Linuxは他のオペレーティングシステム(Windowsなど)とは異なり、例外として。シグナルを扱う場合は、シグナルハンドラを設定する必要があります。しかし、シグナルハンドラからの復帰時には、通常はプログラムが実行されていた場所と同じ場所で実行が継続され、クラッシュする可能性が最も高いです。シグナルハンドラからのクラッシュを防ぐには、シグナルハンドラで問題が発生した場合でも解決する必要があります。例えば、セグメンテーションフォールトに遭遇すると、メモリはアクセスされたロケーションにマッピングされることができる。実際にはほとんど行われておらず、場合によっては実際には不可能です。また、ほとんどの信号は、最適化されたプログラミングエラーのために上昇する。

関連する問題