2016-05-17 8 views
0

この質問は2つの異なる言語であり、2つの異なるエラー処理方法があるため、おそらく2つに分割する必要があります。しかし、私の意見では、C++とCの両方に対応しています。なぜなら、そのルーツはかなり一般的ですから。ひどく私は技術的に可能であり、システム全体の状態に接続された各種のエラーを処理する方法を、彼らはそれから起こるかどうかは行くすでに何かがあることを意味します(またはすでになくなっ) -処理システムコール標準ライブラリの例外的な失敗

そこで質問です間違っている?これにより、malloc()NULLnewbad_alloc、Windows \ Linux socketが「システムに残っているソケットがない」と報告され、スレッドスタックがあふれているようなことが返されます。

さらに、私はそれらをまったく扱うべきですか?理想的な世界では、すべての可能なエラーを処理する必要があるので、エンドユーザーは「システム障害:十分なメモリを割り当てることができませんでした」と表示されます。の代わりに "未処理例外" bad_alloc "および"システム障害:の代わりに ""ソケットを作成できませんでした。 "0x00000000でアクセスが拒否されました"。 C++では、私たちはこのようなint main()何かに置くことができます:

try { 
    Program().Run(); 
} 
catch (std::exception e) { 
    std::cout << "System failure: " << e.what() << std::endl; 
} 
catch (...) { 
    std::cout << "Unknown system failure" << std::endl; 
} 

が、私のプログラムはで終了した場合、私にとって、それは本当に重要ではないんかが存在する場合を「kablamsメモリを読み取ることができません!」取得できなかったハンドルに関する巧妙な言葉のテキストの壁。

私は「naaah、imma feelinはこのラッパーを書くにはあまりにも怠惰だ」と言う人ではありません。この種のエラーが発生する可能性があることを理解していれば、私は通常何とかそれを処理しようとします。私はまた、私たちが厳密に記憶に制限されている埋め込みシステムのように、そのようなことが起こる可能性がある(ほとんどありませんが)日常的に話しているわけではありません。存在しないファイルを開こうとするような些細なことではありません。私はあなたの古典的なLinux \ Windows C \ C++プログラムについて、かなり安定した環境でテストされており、このような環境では99%の割合で起動されることを話しています。

私が言っていることは、これらの事柄のいくつかは例外的な状況ではなく、たいていは例外をはるかに超えているということです。そして時には、私は突然そのメモリを覚えていれば、がに割り当てられないかもしれないし、いくつかのシステム固有のものを読んでください。私はちょうど私の頭を傷つけてそこに座って残っています。 "

+0

防衛プログラミングは、常に、マーフィーの法則とそのすべてを使用してください。それをシステムログまたはカスタムログに記録します。 – t0mm13b

答えて

1

もしあなたがそれを処理して正常な方法で続けることができるエラーに対する賢明な応答があるならば、"バッファのこの巨大な割り当てがbad_allocを投げるなら、より小さなバッファを使用する " - そうしてください。 正当な手段がない場合は、例外を伝播させるか、エラーの戻り値などを報告してから、アプリケーションを終了してください。

エラーが正常に処理され、エラー処理後にプログラムを続行できれば、それは素晴らしいことです。 多くの場合、それはそうではなく、「世界」を非日常的な状態で継続しようとするのではなく、早期にクラッシュするほうがよいです。

関連する問題