プロジェクト

全般

プロフィール

バグ #746

完了

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

Osamu Koga さんがほぼ10年前に追加. 9年以上前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
プラグイン名:
ブランチ:
クラッシュする:

説明

#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を徹底するというのが理想的かなという気はします。

他の形式にエクスポート: Atom PDF