Project

General

Profile

Actions

バグ #746

closed

イベント内で例外が飛んでも握りつぶされてしまうことがある

Added by Osamu Koga almost 10 years ago. Updated over 9 years ago.

Status:
終了
Priority:
通常
Target version:
プラグイン名:
ブランチ:
クラッシュする:

Description

#745 を追っていて気付いたんですが、以下の条件を全て満たす時に例外が握りつぶされ、どこにも報告されない(Activityやnoticeに出ない、例外で落ちない)状態になります。

  • イベントが1つ以上のフィルタをもつ
  • Plugin.callによって発火されたフック(on_xxx)内で例外が発生する
  • Plugin.callがterminate(ないしtrap)されていない

たとえば、on_updateがバグっていて例外を投げるようなプラグインがいた場合、notify_observersが途中で失敗して、そのプラグイン以降のon_updateが実行されなくなりますが、エラーログは全く残らないのでデバッグがとても難しくなります。

event.rb#53-59 のあたりで、例外が起きたらpromise.failに包んで上に持って行こうとしているのが直接的な原因です(他のcallフローではそういう処理をしていないのも怪しい)。
バグが起きた時に追うのが面倒ですし、例外の意義からしてもログが全く残らないというのは良くないので直したほうが良さそうです。

そもそもcallのRDocにはDelayerを返すと書いてあるので、Deferredが返ってくるようになっているのがおかしいように思います。
しかし、個人的にはプラグインの投げた例外もちゃんとcatchしてくれるような機構が欲しいと思っているので、callしたら常にDeferredが返ってくるようにしてしまい、Plugin.callしたらterminateを徹底するというのが理想的かなという気はします。

Actions

Also available in: Atom PDF