#63: on failure (down) reports and cleans up vs. just "throw"
This commit is contained in:
parent
448375d2dc
commit
f01b0538e1
2 changed files with 24 additions and 8 deletions
|
|
@ -95,12 +95,23 @@
|
||||||
(swap! running assoc state {:stop stop})
|
(swap! running assoc state {:stop stop})
|
||||||
(update-meta! [state :status] #{:started}))))
|
(update-meta! [state :status] #{:started}))))
|
||||||
|
|
||||||
(defn- down [state {:keys [stop status] :as current} done]
|
(defn- down
|
||||||
|
"brings a state down by
|
||||||
|
* calling its 'stop' function if it is defined
|
||||||
|
* if not defined, state will still become a 'NotStartedState'
|
||||||
|
* in case of a failure on 'stop', state is still marked as :stopped, and the error is logged / printed
|
||||||
|
* dissoc'ing it from the running states
|
||||||
|
* marking it as :stopped"
|
||||||
|
[state {:keys [stop status] :as current} done]
|
||||||
(when (some status #{:started})
|
(when (some status #{:started})
|
||||||
(when stop
|
(if stop
|
||||||
(on-error (str "could not stop [" state "] due to")
|
(if-let [error (-> (on-error (str "could not stop [" state "] due to")
|
||||||
(record! state stop done)))
|
(record! state stop done)
|
||||||
(alter-state! current (NotStartedState. state)) ;; (!) if a state does not have :stop when _should_ this might leak
|
:fail? false)
|
||||||
|
:f-failed)]
|
||||||
|
(prn error) ;; this would mostly be useful in REPL
|
||||||
|
(alter-state! current (NotStartedState. state)))
|
||||||
|
(alter-state! current (NotStartedState. state))) ;; (!) if a state does not have :stop when _should_ this might leak
|
||||||
(swap! running dissoc state)
|
(swap! running dissoc state)
|
||||||
(update-meta! [state :status] #{:stopped})))
|
(update-meta! [state :status] #{:stopped})))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,14 +8,19 @@
|
||||||
else)))
|
else)))
|
||||||
|
|
||||||
#?(:clj
|
#?(:clj
|
||||||
(defmacro on-error [msg f]
|
(defmacro on-error [msg f & {:keys [fail?]
|
||||||
|
:or {fail? true}}]
|
||||||
`(if-clj
|
`(if-clj
|
||||||
(try ~f
|
(try ~f
|
||||||
(catch Throwable t#
|
(catch Throwable t#
|
||||||
(throw (RuntimeException. ~msg t#))))
|
(if ~fail?
|
||||||
|
(throw (RuntimeException. ~msg t#))
|
||||||
|
{:f-failed (ex-info ~msg {} t#)})))
|
||||||
(try ~f
|
(try ~f
|
||||||
(catch :default t#
|
(catch :default t#
|
||||||
(throw (~'str ~msg " " t#)))))))
|
(if ~fail?
|
||||||
|
(throw (~'str ~msg " " t#))
|
||||||
|
{:f-failed (ex-info ~msg {} t#)}))))))
|
||||||
|
|
||||||
#?(:clj
|
#?(:clj
|
||||||
(defmacro throw-runtime [msg]
|
(defmacro throw-runtime [msg]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue