Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyプログラムを終了する方法

開発者として、私たちはプログラムの実行に多くの時間を費やしているため、プログラムがどのように終了するかを見落としがちです。そしてそれは重要です!プログラムが終了時に正しく動作すると、管理がはるかに簡単になり、標準のdevopsツールで動作する可能性が高くなります。

Rubyプログラムを終了する方法はたくさんあります。それらのいくつかを以下に示しました。この投稿では、これらのそれぞれの詳細と、それらを使用してアプリを行儀の良いUNIX市民にする方法について説明します。

# You can exit by calling a method
exit
exit!
abort("She cannot take any more of this, Captain!")

# ...or by failing to catch an exception
raise("Destroyed...")
fail

# ...or by letting the program end naturally. :)

終了コード、およびあなた

LinuxおよびOSXで実行するすべてのプログラムは、実行が終了すると終了ステータスコードを返します。通常、終了コードは表示されません。これは、プログラムが正常に終了したかどうか、またはエラーが発生したかどうかを判断するために、OSの舞台裏で使用されます。

bashを使用している場合は、$?を調べることで、実行したばかりのプログラムの終了コードを確認できます。 環境変数。以下の例は、失敗した場合と成功した場合の終了コードを示しています。

% ls this-file-doesnt-exist
ls: this-file-doesnt-exist: No such file or directory
blog% echo $?
1
% ls .
bm.rb 
% echo $?
0

一般に、UNIXベースのシステムのルールは、ゼロは成功を意味するということです。ゼロ以外は失敗を意味します。

&&を使用したことがある場合 bashで「演算子」を入力すると、ステータスコードを使用したことになります。以下の例では、プログラムAが成功した場合にのみプログラムBを実行するようにbashに指示しています。

% a && b

このトリックはさまざまな方法で使用できます。たとえば、アセットをプリコンパイルしてCDNにアップロードしたい場合があります。

blog% rake assets:precompile && rake cdn:upload_assets
Rubyでの終了ステータスの指定

Rubyは、多くの終了ステータスを処理してくれます。プログラムが正常に終了すると、「成功」ステータスが返されます。キャッチされなかった例外が原因で失敗した場合は、「失敗」ステータスになります。以下に、例外を発生させたスクリプトの終了コードを示します。

% ruby err.rb
err.rb:1:in `<main>': goodbye (RuntimeError)
tmp% echo $?
1

しかし、キャッチされない例外が必要ない場合はどうなりますか?きれいに終了したいが、それでも「失敗した」エラーコードを返したい場合はどうなりますか?さらに、エラーメッセージ付きのカスタムコードを返したい場合はどうなりますか?

幸いなことに、それは非常に簡単です。 exitに引数を渡すだけです 関数。引数はブール値または整数にすることができます。ブール値の場合、trueは成功を意味します。 0より大きい整数の場合は、成功を意味します。

exit(true) # Exits with "success" code
exit(0) # Exits with "success" code

exit(false) # Exits with "failure" code
exit(1) # Exits with "failure" code

exit(436) # Custom failure error code
どのようにexit ボンネットの下で動作します

exitメソッドは、単にSystemExitを発生させます 例外。キャッチされていない場合、プログラムは他のキャッチされていない例外の場合と同じように中止されます。それはかなりクールですが、いくつかの興味深い結果があります。

すべてのSystemExit例外を飲み込むとしたら、exitメソッドを壊してしまいます。これを以下の例で示しました。

begin
  exit 100
rescue SystemExit => e
  puts "Tried to exit with status #{ e.status }"
end

puts "...but it never exited, because we swallowed the exception"

# Outputs:
# Tried to exit with status 100
# ...but it never exited, because we swallowed the exception

これは、Exceptionを決して救わないもう1つの理由です。 。 SystemExit Exceptionから継承 、Exceptionを飲み込む 出口が壊れます。

begin
  exit
rescue Exception # never do this
  puts "I just broke the exit function!"
end
人間が読める形式のエラーメッセージ

終了コードはマシンには最適ですが、私たち人間は、説明文を少し好むことがよくあります。幸い、OSは、エラーメッセージなどの出力ストリームを提供してくれます。はい、STDERRについて話しています。

他のIOオブジェクトに書き込むのと同じように、STDERRに書き込むことができます。以下の例では、エラーメッセージを書き込んで、「エラー」ステータスで終了しています。

STDERR.puts("ABORTED! You forgot to BAR the BAZ")
exit(false)

これはRubyなので、もちろん、stdoutに書き込んで、エラーコードで終了するより簡潔な方法があります。 abortを使用するだけです メソッド。

# Write the message to STDERR and exit with an error status code.
abort("ABORTED! You forgot to BAR the BAZ")

at_exitによるコールバック

Rubyでは、プログラムが終了するたびに呼び出すことができるハンドラーを登録できます。それらは複数存在する可能性があります。登録されたのとは逆の順序で呼び出されます。次のようになります。

at_exit do 
  puts "handler 1"
end

at_exit do 
  puts "handler 2"
end

# Outputs "handler2\nhandler1" on exit

終了ハンドラーは、終了コードをオーバーライドできます。これを行うには、ハンドラー内からexitを呼び出します。これにより無限ループが発生するように見えますが、そうではありません。 :)

at_exit do 
  exit 100
end

exit 0

# This program exits with a code of 100

コールバックを呼び出さずに終了する場合は、exit!を使用して終了できます。 方法。ただし、これらのコールバックに依存するgemまたはその他のサードパーティコードがある場合は、問題が発生する可能性があることに注意してください。

興味深い脇

多くのライブラリがat_exitを使用していることがわかりました 独創的で-そして一部の人はハッキーと言うかもしれません-方法で。たとえば、Sinatraはat_exitを使用します Webアプリを起動する方法としてにフックします。これにより、サーバーを起動する前に、すべてのコードがロードされていることを確認できます。外観は次のとおりです。

module Sinatra
  class Application < Base

   ...

  at_exit { Application.run! if $!.nil? && Application.run? }
end

これについては、Arkencyブログにすばらしい投稿があります。at_exitを悪用していますか?


  1. マトリックスとは何ですか?Rubyでそれを使用する方法は?

    マトリックスは、スプレッドシートのようなデータを保存および操作するために使用できる2D(2次元)配列です。 次の用途に使用できます : テーブルゲーム(チェス、チェッカーなど)でボードを表す 統計とデータ分析 プロットとグラフの生成 これは強力なデータ構造であるため、使用方法を学ぶのに役立ちます。 Rubyでマトリックスを作成する方法 配列を使用して行列を作成できます。 このように : matrix = [ [1,2,3], [4,5,6], [7,8,9] ] これにより、3×3のマトリックスが生成されます。これは、2次元データをボードまたは位置のセットとして保

  2. RubyでStructとOpenStructを使用する方法

    Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた