中止、終了、または終了? 質問する

中止、終了、または終了? 質問する

これら 3 つの違いは何ですか? また、適切に処理できない例外が発生した場合、どのようにプログラムを終了すればよいですか?

ベストアンサー1

  • アボートプログラムの「異常」終了を示し、POSIX シグナル SIGABRT を発生させます。つまり、そのシグナルに登録したハンドラが呼び出されますが、どちらの場合でもプログラムはその後終了します。通常、abortC プログラムでは、入力の誤りやネットワーク障害などではなく、プログラムのバグである可能性が高い予期しないエラー ケースから終了するために使用します。たとえば、論理abort的には決して発生しないはずのデータ構造に NULL ポインターが含まれていることがわかった場合などに使用します。

  • 出口はプログラムの「正常」終了を示しますが、これは失敗を示している可能性があります (ただしバグではありません)。言い換えると、exitユーザーが入力した内容を解析できなかった場合やファイルを読み取れなかった場合に、エラー コードが表示される可能性があります。終了コード 0 は成功を示します。は、プログラムを終了する前にオプションでハンドラを呼び出します。これらは、および関数exitに登録されます。atexiton_exit

  • std::終了は、未処理の例外がある場合に C++ プログラムで自動的に呼び出されるものです。これはabort、例外をスローすることによってすべての例外エラーを報告していると仮定すると、基本的に C++ の に相当します。これは、関数によって設定されたハンドラを呼び出しますstd::set_terminate。デフォルトでは、単に を呼び出しますabort

abortC++ では、エラー時にまたはを呼び出すことは通常避けますexit。例外をスローして、呼び出しスタックのさらに上のコードにプログラムを終了するのが適切かどうかを判断させる方がよいexitためです。 を成功させるかどうかは状況次第です。つまり、 の return ステートメント以外の場所でプログラムを終了するのが適切かどうかですmain

std::terminateC++でも、最後の手段のエラー報告ツールとして考えるべきである。問題は、std::terminate終了ハンドラがない処理されなかった例外にアクセスできないため、それが何であったかを知る方法はありません。通常は、 main 全体をブロックでラップする方がはるかに適切ですtry { } catch (std::exception& ex) { }。そうすれば、少なくとも派生した例外に関する詳細情報を報告できますstd::exception(もちろん、派生していない例外はstd::exception依然として処理されません)。

maininの本体をラップすることtry { } catch(...) { }は、終了ハンドラを設定することよりあまり良くありません。なぜなら、この場合も、問題の例外にアクセスできないからです。ただし、少なくとも 1 つの利点があります。例外が完全にキャッチされなかった場合にスタックのアンワインドが行われるかどうかは実装定義であるため、スタックのアンワインドを確実に行う必要がある場合は、これがその方法になります。

おすすめ記事