web-dev-qa-db-ja.com

exitとabortの違いは何ですか?

abort ドキュメントには、abort

効果的にKernel.exit(false)を呼び出して、すぐに実行を終了します。

「即座に」とはどういう意味ですか? abortexitのステータスがtrue以外の場合の違いは何ですか?

33
x-yuri

" 終了、終了!中止、レイズ…Get Me Outta Here! "は、あなたが知りたいと思うすべてを説明しています。

要するに:

  • Kernel.exit(code) スクリプトをすぐに「終了」し、codeをOSに返しますが、実行する直前に、コードが持つことができる登録済みのat_exitハンドラーを呼び出します登録済み。
  • Kernel.exit!(code) は同じことを行いますが、すぐに終了し、at_exitハンドラーは呼び出されません。
  • Kernel.abort(message)messageを取り、失敗コード= 1で終了する直前にSTDERRに出力されます。

終了コードの異なる値は、問題の検出とコードのデバッグにほとんど適していません。ただし、使用方法は非常に簡単で、親プロセスにそれらを読み取らせることはほとんど簡単です。したがって、exitおよびexit!です。

より多くの時間を費やしてエラーチェックをより堅牢にできる場合は、コードだけでなく、いくつかの重大なエラーメッセージが必要になります。従来、存在する場合は、STDERRに出力できます。通常のputsを使用して手動でSTDERRに印刷できますが、終了コードは最低レベルで使用されます。

STDERRへの印刷では、ジョブが自動的に失敗としてマークされることはないため、abortは作成して簡単に終了できるように作成されました。デフォルトの終了コード1は、すべての実際のコンテキスト情報が提供されるエラーメッセージに含まれると想定されているため、FAIL条件をマークするには十分です。

また、rescueを持たないraise "wtf"などの未処理の例外は、実際にはKernel.abortを呼び出しているかのように動作し、STDERRに出力してexitcode=1を使用します。

exit(false)と言いましたが、 exit! のドキュメントには、使用するパラメーターがstatus codeであると書かれています。

私はWindows上でそれをチェックしましたRuby 1.9.3:

exit 0       # quits with code: 0
exit 1       # quits with code: 1
exit false   # quits with code: 1
exit true    # quits with code: 0

falseが従来のCの方法で0に強制されると思うので、これは本当に驚きです。そのため、使用するコードを完全に明確にするために、01などの整数を使用する必要があります。

42
quetzalcoatl