LINUX.ORG.RU

Не могу рестартануть агент из обработчика ошибки

 


0

2
user=> (def q (agent ""))
#'user/q
user=> (set-error-handler! q (fn [& _] (println "restart") (restart-agent q "")))
nil
user=> (send q inc)
restart
#<Agent@3d921eac FAILED: "">
user=> (send q str)
ClassCastException java.lang.String cannot be cast to java.lang.Number  clojure.lang.Numbers.inc (Numbers.java:110)
user=> (restart-agent q "")
""
user=> (send q str)
#<Agent@3d921eac: "">
user=> 

Почему так?

★★★★★

Ответ на: комментарий от Kostafey

По-моему вам с такими вопросами сюда:

Я просто не уверен был, фича это или баг.
Спасибо за ответ.

Debasher ★★★★★
() автор топика
Ответ на: комментарий от Debasher

Я просто не уверен был, фича это или баг.

Да независимо от, на самом деле. Если это даже и фича, то незадокументированная. Следовательно, это баг документации. У lein, например, именно такая политика.

Не за что.

Kostafey
()

На самом деле попытка вызвать рестарт из эррор-хендлера падает с исключением, но ты этого не видишь так как ошибки в эррор-хендлере втихую ловятся и забываются. Смотри:

user=> (def q (agent ""))
#'user/q
user=> (set-error-handler! q (fn [ag _] 
                               (try 
                                (restart-agent ag "") 
                                (catch Exception ex (println ex)))))
nil
user=> (send q inc)
#<Agent@47c5e6ed: ""
#<RuntimeException java.lang.RuntimeException: Agent does not need a restart>

Иными словами, в момент когда вызывается эррор-хендлер, агент еще не зафейленный чтобы его рестартить.

unlog1c ★★★
()
Последнее исправление: unlog1c (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.