1. ホーム
  2. ruby

[解決済み] RubyでCtrl-cをキャプチャする

2022-11-09 21:54:06

質問

長い間稼働しているレガシーなrubyプログラムを渡されましたが、そのプログラムには数多くの

begin
  #dosomething
rescue Exception => e
  #halt the exception's progress
end

を通して

これらのそれぞれが処理しうる例外を一つ残らず追跡することなく (少なくともすぐには) 、私はまだ、時には Ctrl C .

そして、コードを追加するだけの方法でそうしたいと思います(既存の動作に影響を与えたり、実行中に別の方法で捕捉された例外を見逃したりしないように)。

[ Ctrl C はSIGINT、つまりSystemExitと同等と思われます。 SignalException.new("INT") に相当すると思われます。 class SignalException < Exception であるため、この問題が出てくるのです]。

私が書きたいコードは、次のようになります。

begin
  #dosomething
rescue SignalException => e
  raise e
rescue Exception => e
  #halt the exception's progress
end

EDIT: このコードは、トラップしたい例外のクラスを正しく取得する限り、動作します。それは、以下のように SystemExit、Interrupt、または IRB::Abort のいずれかです。

どのように解決するのですか?

この問題は、Ruby のプログラムが終了するとき、そのプログラムは SystemExit . control-C が入力されると インタラプト . 両方とも システム終了 割り込み から派生したもので 例外 を使用している場合、例外処理によって終了または割り込みが停止してしまいます。 以下がその修正方法です。

可能な限り

rescue Exception => e
  # ...
end

から

rescue StandardError => e
  # ...
end

StandardErrorに変更できないものについては、例外を発生させ直してください。

rescue Exception => e
  # ...
  raise
end

または、最低でもSystemExitとInterruptを再レイズする。

rescue SystemExit, Interrupt
  raise
rescue Exception => e
  #...
end

カスタム例外を作成する場合は 標準エラー ではなく 例外 .