정말 예기치 않은 오류가 발생했을 때 Clojure 프로그램 인 Infocard Workbench를 디버깅했습니다. 실행중인 프로그램 인 (-main)
이 Clojure/C에 의해 호출 되더라도 함수에서 (swank.core/break)
함수가 실행을 중단 한 CLI 창에 오류를 발생 시켰습니다. 스웽크 REPL. break 문을 주석 처리 할 때 프로그램은 정상적으로 작동합니다. REPL을 만든 leiningen 프로세스에서 SWANK REPL 자체가 아니라 왜 오류가 발생 했습니까?Clojure/Swank`break`가 Leiningen 프로세스를 종료합니다 - 왜?
중요한 경우 프로그램에서 다음 라이브러리를 사용합니다. Seesaw (Swing UI); Piccolo2D (스윙 2D 그래픽); Sedna (XQuery 액세스가있는 XML 데이터베이스).
스택 추적은 아래와 같습니다. "GW COMMENT >>>"를 시작하는 줄은 내가 추가 한 주석 줄이며 추적의 일부가 아닙니다.
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException:
Var swank.core.connection/*current-connection* is unbound.
내가 실행에 연결하는 방법을 *current-connection*
볼 수 없습니다 : 오류 메시지를 불러
(defn display-file-icards ; NEW API 111002
""
[shortname coll-name layer-name]
(println "reached display-file-icards")
(let [icard-seq (get-file-icards shortname coll-name)
slip-seq (doall (map unified-load icard-seq))]
(println "display-file-icards: exited let-bindings")
(swank.core/break)
(display-seq slip-seq layer-name)))
:
--- BEGIN cli window output ---
generic-sh-d: field-text is
GW COMMENT >>> Here, I'm in the menu handler for a file-open operation (Seesaw)
shortname-hdlr: filename is t
shortname-handler, inside 2nd 'let'
reached display-file-icards
GW COMMENT >>> Here, I'm printing out actual XQueries to the Sedna database.
declare default element namespace 'http://infoml.org/infomlFile'; for $base in doc('t', 'daily')/infomlFile/infoml[position() != 1] return $base/@cardId/string()
unified-load, before
declare default element namespace 'http://infoml.org/infomlFile';
for $base in collection('daily')/infomlFile/infoml[@cardId = 'gw667_110929221548137']
return ($base/data/title/string(), $base/data/content/string(), $base/selectors/tag/string())
GW COMMENT >>> More XQueries; the "AFTER" indicates the query completed w/o crashing
unified-load, AFTER
unified-load, before
declare default element namespace 'http://infoml.org/infomlFile';
for $base in collection('daily')/infomlFile/infoml[@cardId = 'gw667_110929221638791']
return ($base/data/title/string(), $base/data/content/string(), $base/selectors/tag/string())
unified-load, AFTER
GW COMMENT >>> omitted several before/AFTER pairs; all were successful
GW COMMENT >>> Here's the actual error; note the namespace, swank.core.connection
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Var swank.core.connection/*current-connection* is unbound.
at clojure.lang.Var.deref(Var.java:142)
at clojure.lang.Var.get(Var.java:133)
at swank.core$send_to_emacs.invoke(core.clj:76)
at swank.core$sldb_loop.invoke(core.clj:203)
at swank.core$invoke_debugger.invoke(core.clj:214)
at infwb.sedna$display_file_icards.invoke(NO_SOURCE_FILE:1)
at infwb.misc_dialogs$shortname_handler.invoke(misc_dialogs.clj:76)
at infwb.core$make_app$open_h__3812.invoke(core.clj:37)
at seesaw.action$action$fn__386.invoke(action.clj:74)
at seesaw.action.proxy$javax.swing.AbstractAction$0.actionPerformed(Unknown Source)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
unified-load, AFTER
display-file-icards: exited let-bindings
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.AbstractButton.doClick(AbstractButton.java:389)
at com.apple.laf.ScreenMenuItem.actionPerformed(ScreenMenuItem.java:95)
at java.awt.MenuItem.processActionEvent(MenuItem.java:627)
at java.awt.MenuItem.processEvent(MenuItem.java:586)
at java.awt.MenuComponent.dispatchEventImpl(MenuComponent.java:337)
at java.awt.MenuComponent.dispatchEvent(MenuComponent.java:325)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:682)
at java.awt.EventQueue.access$000(EventQueue.java:85)
at java.awt.EventQueue$1.run(EventQueue.java:638)
at java.awt.EventQueue$1.run(EventQueue.java:636)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:652)
at java.awt.EventQueue$2.run(EventQueue.java:650)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:649)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
--- END cli window output ---
다음은 break
문을 포함하는 함수의 a Swank break
메시지입니다. 내 프로그램에는 *current-connection*
이라는 심볼이 있지만, 내 REPL이 실행중인 네임 스페이스와 다른 네임 스페이스 infwb.sedna
인 infwb.core
입니다.
누군가가 원한다면 더 많은 Clojure 소스 코드를 게시 할 수 있습니다. 이것에 대해 생각해 볼 시간을내어 주셔서 감사합니다.