やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

「終了処理」を読む

 ふーん、て感じ。

成果物

情報源

終了処理

Rubyスクリプトの終端に達した場合や捕捉していない例外が発生した場合に終了します(関数 Kernel.#exitKernel.#abort 、メインスレッドに対する Thread.kill などは SystemExit 例外を発生させます)。終了時には以下の処理が順に実行されます。

  1. すべてのスレッドを Thread.kill する。
  2. Ruby の疑似シグナルSIGEXITのハンドラが登録されていればそれを実 行する(Kernel.#trap を参照)。
  3. 制御構造/END ブロック(END { ... }または関数 Kernel.#at_exit で指定したブロック)が登録されていれば、 そのブロックを登録とは逆順に実行する。このブロックの実行中に発生 した大域脱出はそのブロックの処理を中断するが、スクリプトはまだ終 了しない。
  4. ObjectSpace.#define_finalizer により、ファイナ ライザが登録されていればそれらを実行する。実行順序は不定。 ファイナライザ実行中に発生した大域脱出はそのファイナライザの処理 を中断するが、スクリプトはまだ終了しない。
  5. exit(3) により終了する。このとき渡される終了ステータス値は終了方法によります。例えば、 スクリプトの終端に達した場合は0
    1. Kernel.#exit に渡した引数
    2. SystemExit による例外以外は1
    3. 関数 Kernel.#exit! による終了は、_exit(2) を実行するだけで、上記の処理はいずれも行われません。

 ふーん。ぜんぜんわからん。ようするに普段は例外キャッチすればいいんでしょ?

begin 
  raise
rescue => e
  p e
ensure
  p "絶対実行"
end

 そんで以下のやつらでフックできると。

 上記を学習する必要性を感じない。ので放置する。

所感

 制御構造/ENDくらいなら簡単でいいんだけどね。

対象環境

$ uname -a
Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux