Problem: When I connect to a socket server and create a thread, exceptions in the thread are printed in the server's process, not the client's. I'd like them to appear in the client's process, where the thread was created.
(I'm using the term "process" very generally here, because I don't understand what is going on.)
From searching, I understand that there are some other things at play, like System/err, but I don't understand what is happening or how I can work around it. Why does an exception thrown in the client process show in the client process, but an exception thrown in a thread created by the client process shows in the server process? Why doesn't binding *err* in a thread seem to have any effect? Any suggestions or workarounds?
I'm not using futures, because this is a long-running process that never returns a value.
Example transcript:
# Socker server
(The only command entered is the first one, which begins with clj. Everything after "user=>" is due to the client below.)
$ clj -J-Dclojure.server.myrepl='{:port 5555,:accept,clojure.core.server/repl}'
Clojure 1.10.1
user=> My second message.
Exception in thread "Thread-0" clojure.lang.ExceptionInfo: My second exception {}
at user$eval5$fn__141.invoke(NO_SOURCE_FILE:7)
at clojure.lang.AFn.run(AFn.java:22)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "Thread-1" clojure.lang.ExceptionInfo: My third exception {}
at user$eval144$fn__145.invoke(NO_SOURCE_FILE:16)
at clojure.lang.AFn.run(AFn.java:22)
at java.lang.Thread.run(Thread.java:745)
# Client
$ nc localhost 5555
user=> (println "My first message.")
My first message.
nil
user=> (throw (ex-info "My first exception." {}))
Execution error (ExceptionInfo) at user/eval3 (REPL:2).
My first exception.
user=> (.start
(Thread.
(fn []
(println "My second message.")
(throw (ex-info "My second exception" {})))))
nil
user=> (.start
(Thread.
(let [out *out*
err *err*]
(fn []
(binding [*out* out
*err* err]
(println "My third message.")
(throw (ex-info "My third exception" {})))))))
nil
My third message.
Any clues would be appreciated. Thanks!