diff --git a/backend/src/app/http/errors.clj b/backend/src/app/http/errors.clj index d2e45ed010..6f0d85cc03 100644 --- a/backend/src/app/http/errors.clj +++ b/backend/src/app/http/errors.clj @@ -76,6 +76,7 @@ {:status 500 :body {:type :server-error + :code :assertion :data (-> edata (assoc :explain (explain-error edata)) (dissoc :data))}})) @@ -103,6 +104,7 @@ :cause error) {:status 500 :body {:type :server-error + :code :unexpected :hint (ex-message error) :data edata}})))) @@ -132,7 +134,8 @@ :else {:status 500 - :body {:type :server-timeout + :body {:type :server-error + :code :psql-exception :hint (ex-message error) :state state}}))) diff --git a/frontend/src/app/main/ui.cljs b/frontend/src/app/main/ui.cljs index 9b2c772a59..95437edd45 100644 --- a/frontend/src/app/main/ui.cljs +++ b/frontend/src/app/main/ui.cljs @@ -226,8 +226,9 @@ [error] (ts/schedule (st/emitf - (dm/show {:content "Unexpected validation error (server side)." - :type :error}))) + (dm/show {:content "Unexpected validation error." + :type :error + :timeout 3000}))) ;; Print to the console some debug info. (js/console.group "Validation Error") @@ -243,58 +244,82 @@ ;; assertion (assertion that is preserved on production builds). From ;; the user perspective this should be treated as internal error. (defmethod ptk/handle-error :assertion - [{:keys [data stack message context] :as error}] - (ts/schedule - (st/emitf (dm/show {:content "Internal error: assertion." - :type :error}))) + [{:keys [data stack message hint context] :as error}] + (let [message (or message hint) + context (str/fmt "ns: '%s'\nname: '%s'\nfile: '%s:%s'" + (:ns context) + (:name context) + (str cfg/public-uri "/js/cljs-runtime/" (:file context)) + (:line context))] + (ts/schedule + (st/emitf + (dm/show {:content "Internal error: assertion." + :type :error + :timeout 3000}) + (ptk/event ::ev/event + {::ev/type "exception" + ::ev/name "assertion-error" + :message message + :context context + :trace stack}))) - ;; Print to the console some debugging info - (js/console.group message) - (js/console.info (str/format "ns: '%s'\nname: '%s'\nfile: '%s:%s'" - (:ns context) - (:name context) - (str cfg/public-uri "/js/cljs-runtime/" (:file context)) - (:line context))) - (js/console.groupCollapsed "Stack Trace") - (js/console.info stack) - (js/console.groupEnd "Stack Trace") - (js/console.error (with-out-str (expound/printer data))) - (js/console.groupEnd message)) + ;; Print to the console some debugging info + (js/console.group message) + (js/console.info context) + (js/console.groupCollapsed "Stack Trace") + (js/console.info stack) + (js/console.groupEnd "Stack Trace") + (js/console.error (with-out-str (expound/printer data))) + (js/console.groupEnd message))) ;; This happens when the backed server fails to process the ;; request. This can be caused by an internal assertion or any other ;; uncontrolled error. (defmethod ptk/handle-error :server-error - [{:keys [data] :as error}] - (ts/schedule - (st/emitf (dm/show - {:content "Something wrong has happened (on backend)." - :type :error}))) + [{:keys [data hint] :as error}] + (let [hint (or hint (:hint data) (:message data)) + info (with-out-str (pprint (dissoc data :explain))) + expl (:explain data)] + (ts/schedule + (st/emitf + (dm/show {:content "Something wrong has happened (on backend)." + :type :error + :timeout 3000}) + (ptk/event ::ev/event + {::ev/type "exception" + ::ev/name "server-error" + :hint hint + :info info + :explain expl}))) - (js/console.group "Internal Server Error:") - (js/console.error "hint:" (or (:hint data) (:message data))) - (js/console.info - (with-out-str - (pprint (dissoc data :explain)))) - (when-let [explain (:explain data)] - (js/console.error explain)) - (js/console.groupEnd "Internal Server Error:")) + (js/console.group "Internal Server Error:") + (js/console.error "hint:" hint) + (js/console.info info) + (when expl (js/console.error expl)) + (js/console.groupEnd "Internal Server Error:"))) (defmethod ptk/handle-error :default [error] (if (instance? ExceptionInfo error) (ptk/handle-error (ex-data error)) - (do + (let [stack (.-stack error) + hint (or (ex-message error) + (:hint error) + (:message error))] (ts/schedule - (st/emitf (dm/assign-exception error))) + (st/emitf + (dm/assign-exception error) + (ptk/event ::ev/event + {::ev/type "exception" + ::ev/name "unexpected-error" + :message hint + :trace (.-stack error)}))) (js/console.group "Internal error:") - (js/console.log "hint:" (or (ex-message error) - (:hint error) - (:message error))) + (js/console.log "hint:" hint) (ex/ignoring (js/console.error (clj->js error)) - (js/console.error "stack:" (.-stack error))) + (js/console.error "stack:" stack)) (js/console.groupEnd "Internal error:")))) (defonce uncaught-error-handler