Clojure。异常后如何恢复REPL?

问题描述 投票:0回答:1

当你使用mount重新加载你的应用程序后出现错误时,正确的工作流程是什么?

举个例子。

user> (restart)
#error {
 :cause "Unable to resolve symbol: account-database in this context"
 :via
 [{:type clojure.lang.Compiler$CompilerException
   :message "Syntax error compiling at (app/model/session.clj:55:39)."
   :data #:clojure.error{:phase :compile-syntax-check, :line 55, :column 39, :source "app/model/session.clj"}
   :at [clojure.lang.Compiler analyze "Compiler.java" 6808]}
  {:type java.lang.RuntimeException
   :message "Unable to resolve symbol: account-database in this context"
   :at [clojure.lang.Util runtimeException "Util.java" 221]}]
 :trace
 [[clojure.lang.Util runtimeException "Util.java" 221]
Reloadable Clojure REPL
user> (restart)
Syntax error compiling at (*cider-repl Projects/pollcro:localhost:43993(clj)*:597:7).
Unable to resolve symbol: restart in this context
user> (start)
Syntax error compiling at (*cider-repl Projects/pollcro:localhost:43993(clj)*:600:7).
Unable to resolve symbol: start in this context

在修复了一个错误后,由于以下错误,我无法再(重启)这个回复。

无法解析符号:在此上下文中重启。

它总是这样,还是我的 REPL 工作流程做错了什么?

作为一个变通办法,我用苹果酒退出我的REPL会话,然后再重新开始,但这很烦人。

似乎我可以在修复错误后使用 mountstart。

user> (mount/start)
{:started
 ["#'app.server-components.config/config"
  "#'app.model.database/pool"
  "#'app.model.mock-database/conn"]}

但它完全失去了我的用户命名空间范围 REPL看不到它的任何方法 + 我不能发送用户命名空间给repl,因为下面的错误。

Syntax error compiling at (app/server_components/pathom.clj:1:1).
namespace 'app.model.session' not found
("src/main" "src/dev" "src/test")#function[expound.alpha/printer]nil#'user/start#'user/stop#'user/restartnil


这就是我的 用户名称空间 的样子。

(ns user
  (:require
    [clojure.tools.namespace.repl :as tools-ns :refer [set-refresh-dirs]]
    [expound.alpha :as expound]
    [clojure.spec.alpha :as s]
    [mount.core :as mount]
    ;; this is the top-level dependent component...mount will find the rest via ns requires
    [app.server-components.http-server :refer [http-server]]))

;; ==================== SERVER ====================
(set-refresh-dirs "src/main" "src/dev" "src/test")
;; Change the default output of spec to be more readable
(alter-var-root #'s/*explain-out* (constantly expound/printer))

(defn start
  "Start the web server"
  [] (mount/start))

(defn stop
  "Stop the web server"
  [] (mount/stop))

(defn restart
  "Stop, reload code, and restart the server. If there is a compile error, use:

  (tools-ns/refresh)

  to recompile, and then use `start` once things are good."
  []
  (stop)
  (tools-ns/refresh :after 'user/start))
clojure jvm read-eval-print-loop cider
1个回答
0
投票

这里有一个似乎在错误情况下有效的变通方法。

  1. 一个固定文件的内容需要被发送到REPL上
  2. 转回 user 命名空间
  3. 发送您的 user 命名空间到REPL
  4. 没有4--你只是拿回了你的REPL。

这时你可以使用你的常规 (start), (stop), (restart).

© www.soinside.com 2019 - 2024. All rights reserved.