Gauche > Archives > 2011/10/26

2011/10/26 01:10:50 UTCshiro
#
マウス中心の操作なら、メニューやパネルが横置きの方が視線もカーソルも移動距離が短いかもしれませんね。
2011/10/26 06:53:54 UTCbugyo
#
Gaucheで、子スレッドでエラーが起こったときスタックトレースを表示するにはどうしたらよいのでしょう。
2011/10/26 11:00:07 UTCshiro
#
あっそれは長年のバグだったような。
2011/10/26 11:18:50 UTCshiro
#
本来はwith-exception-handlerで捕まえてその中で(%vm-shot-stack-trace (vm-get-stack-trace-lite)) などとすれば表示されるべきなんですが、今はうまく動かない
#
次善の策として、こんなふうにすることはできる:
#
(define (run)
  (let1 t (make-thread body-thunk)
    (vm-set-default-exception-handler t (^e (%vm-show-stack-trace (vm-get-stack-trace-lite))))
    (thread-start! t)
    (thread-join! t)
    ))
#
これだと「捕捉されない」エラーがbody-thunk内で発生した時にスタックトレースが表示される。ただ、エラーが捕捉されてないので、thread-join!した時にそのエラーが親の方にuncaught-exceptionとして伝わるのに注意。親の方でそれを捕まえて処理する必要あり。
#
原則として、uncaught-exceptionを出さないために、スレッドはそのbody-thunkの中で必ずguardしてエラーを捕まえることが推奨されるけど、それをしてしまうと上のテクニックでスタックトレースが表示されなくなる(guardでエラーが捕まえられちゃうからdefault-exception-handlerまで制御が渡らない)。なので根本的な解決にはならない。
#
exceptionにスタックトレースをつけるのが一番使いやすいんだけど、そうすると例外を投げるのが重くなるのでどうしようかなあっと数年悩んでるところ。
2011/10/26 16:42:59 UTCbugyo
#
今回はこれで十分でした。ありがとうございます。
2011/10/26 16:47:33 UTCbugyo
#
スレッドを越えてexceptionが伝わるんですね。
#
デバッグモードで実行するときは例外発生時にスタックトレースを取る、でよいのではないでしょうか。