@toshi_a world_settingの中でDeferred.fail("message")すると uncaught throw :__deferredable_fail で落ちるのはどうしてでしょうか? core/plugin/change_account/change_account.rbのon_request_world_addではdialogDSLでアカウント追加ダイアログを出して、.trapで拾っているように見えるんですが……

@cobodo Deferredのバグで滅多に問題にならないやつで、ThreadのなかでDeferred.#failを使ったら死ぬというのがあるので、多分それですね。
回避方法としては適当な例外をraiseする(trap節で例外オブジェクトを受け取れる)というのがあります。
Deferred.#failも専用の例外をraiseするように書き換えようと思っています。ついに指摘されたから今日絶対やる(使命感)

@toshi_a やりたいことは、ユーザーの入力内容によっては(それが妥当でないことを示して)world作成を中止する、ということなんですが、Deferred.failを使う以外の推奨する方法はありますか? なければ修正を待ちます。

@cobodo 適当な例外クラスを定義して

Deferred.next{
raise TeokureError, "too late"
}.trap{|exc|
p exc.class # TeokureError
p exc.message # "too late"
}

みたいな。TeokureErrorに適当なメンバ変数とアクセサを用意しておけばString以外の値も渡せます。受け取った後はDefered.failがうまく言った場合とやることは同じですね

フォロー

@toshi_a いえ、Deferred一般の話ではなくて、world_settingの話です。

ログインして会話に参加
金具

俺達は雰囲気でインスタンスを立てている