2017-11-07 2 views
2

다음 코드는 db에 새 테이블을 만듭니다. 나는 그것이 모든 SQL 오류를 잡아서 테이블이 이미 존재한다면 계속해서 실행하고 싶습니다. 그러나 코드를 실행할 때 테이블이 이미 있으면 예상대로 예외가 발생하지만 컴파일 중에 코드가 종료됩니다. try catch가 무시되고 있습니까?캐치를 무시 하시겠습니까?

코드 :

(ns app.storage 
    (:import com.mchange.v2.c3p0.ComboPooledDataSource 
      (clojure.lang ExceptionInfo)) 
    (:require [clojure.java.jdbc :refer :all])) 

(def db { 
     :classname "org.sqlite.JDBC" 
     :subprotocol "sqlite" 
     :subname  "src/storage/journal.db" 
     }) 

(defn create-db [] 
    (try 
    (db-do-commands db 
        (create-table-ddl :entry 
             [:id :primary :key] 
             [:account "varchar(255)"] 
             [:timestamp "timestamp"] 
             [:debt "double(9,2)"] 
             [:credit "double(9,2)"])) 

    (catch ExceptionInfo e 
     (println e)))) 

(create-db) 

예외 :

Exception in thread "main" java.sql.BatchUpdateException: batch entry 0: [SQLITE_ERROR] SQL error or missing database (table entry already exists), compiling:(app/storage.clj:29:21) 
    at clojure.lang.Compiler.load(Compiler.java:7142) 
    at clojure.lang.RT.loadResourceScript(RT.java:370) 
    at clojure.lang.RT.loadResourceScript(RT.java:361) 
    at clojure.lang.RT.load(RT.java:440) 
    at clojure.lang.RT.load(RT.java:411) 
    at clojure.core$load$fn__5066.invoke(core.clj:5641) 
    at clojure.core$load.doInvoke(core.clj:5640) 
    at clojure.lang.RestFn.invoke(RestFn.java:408) 
    at clojure.core$load_one.invoke(core.clj:5446) 
    at clojure.core$load_lib$fn__5015.invoke(core.clj:5486) 
    at clojure.core$load_lib.doInvoke(core.clj:5485) 
    at clojure.lang.RestFn.applyTo(RestFn.java:142) 
    at clojure.core$apply.invoke(core.clj:626) 
    at clojure.core$load_libs.doInvoke(core.clj:5524) 
    at clojure.lang.RestFn.applyTo(RestFn.java:137) 
    at clojure.core$apply.invoke(core.clj:628) 
    at clojure.core$use.doInvoke(core.clj:5618) 
    at clojure.lang.RestFn.invoke(RestFn.java:408) 
    at app.entry$eval2001$loading__4958__auto____2002.invoke(entry.clj:1) 
    at app.entry$eval2001.invoke(entry.clj:1) 
    at clojure.lang.Compiler.eval(Compiler.java:6703) 
    at clojure.lang.Compiler.eval(Compiler.java:6692) 
    at clojure.lang.Compiler.load(Compiler.java:7130) 
    at clojure.lang.RT.loadResourceScript(RT.java:370) 
    at clojure.lang.RT.loadResourceScript(RT.java:361) 
    at clojure.lang.RT.load(RT.java:440) 
    at clojure.lang.RT.load(RT.java:411) 
    at clojure.core$load$fn__5066.invoke(core.clj:5641) 
    at clojure.core$load.doInvoke(core.clj:5640) 
    at clojure.lang.RestFn.invoke(RestFn.java:408) 
    at clojure.core$load_one.invoke(core.clj:5446) 
    at clojure.core$load_lib$fn__5015.invoke(core.clj:5486) 
    at clojure.core$load_lib.doInvoke(core.clj:5485) 
    at clojure.lang.RestFn.applyTo(RestFn.java:142) 
    at clojure.core$apply.invoke(core.clj:626) 
    at clojure.core$load_libs.doInvoke(core.clj:5524) 
    at clojure.lang.RestFn.applyTo(RestFn.java:137) 
    at clojure.core$apply.invoke(core.clj:628) 
    at clojure.core$use.doInvoke(core.clj:5618) 
    at clojure.lang.RestFn.invoke(RestFn.java:408) 
    at app.handler$eval1687$loading__4958__auto____1688.invoke(handler.clj:1) 
    at app.handler$eval1687.invoke(handler.clj:1) 
    at clojure.lang.Compiler.eval(Compiler.java:6703) 
    at clojure.lang.Compiler.eval(Compiler.java:6692) 
    at clojure.lang.Compiler.load(Compiler.java:7130) 
    at clojure.lang.RT.loadResourceScript(RT.java:370) 
    at clojure.lang.RT.loadResourceScript(RT.java:361) 
    at clojure.lang.RT.load(RT.java:440) 
    at clojure.lang.RT.load(RT.java:411) 
    at clojure.core$load$fn__5066.invoke(core.clj:5641) 
    at clojure.core$load.doInvoke(core.clj:5640) 
    at clojure.lang.RestFn.invoke(RestFn.java:408) 
    at clojure.core$load_one.invoke(core.clj:5446) 
    at clojure.core$load_lib$fn__5015.invoke(core.clj:5486) 
    at clojure.core$load_lib.doInvoke(core.clj:5485) 
    at clojure.lang.RestFn.applyTo(RestFn.java:142) 
    at clojure.core$apply.invoke(core.clj:626) 
    at clojure.core$load_libs.doInvoke(core.clj:5524) 
    at clojure.lang.RestFn.applyTo(RestFn.java:137) 
    at clojure.core$apply.invoke(core.clj:626) 
    at clojure.core$require.doInvoke(core.clj:5607) 
    at clojure.lang.RestFn.invoke(RestFn.java:421) 
    at user$eval5.invoke(form-init1139882819344867506.clj:1) 
    at clojure.lang.Compiler.eval(Compiler.java:6703) 
    at clojure.lang.Compiler.eval(Compiler.java:6692) 
    at clojure.lang.Compiler.load(Compiler.java:7130) 
    at clojure.lang.Compiler.loadFile(Compiler.java:7086) 
    at clojure.main$load_script.invoke(main.clj:274) 
    at clojure.main$init_opt.invoke(main.clj:279) 
    at clojure.main$initialize.invoke(main.clj:307) 
    at clojure.main$null_opt.invoke(main.clj:342) 
    at clojure.main$main.doInvoke(main.clj:420) 
    at clojure.lang.RestFn.invoke(RestFn.java:421) 
    at clojure.lang.Var.invoke(Var.java:383) 
    at clojure.lang.AFn.applyToHelper(AFn.java:156) 
    at clojure.lang.Var.applyTo(Var.java:700) 
    at clojure.main.main(main.java:37) 
Caused by: java.sql.BatchUpdateException: batch entry 0: [SQLITE_ERROR] SQL error or missing database (table entry already exists) 
    at org.sqlite.Stmt.executeBatch(Stmt.java:226) 
    at clojure.java.jdbc$execute_batch.invoke(jdbc.clj:400) 
    at clojure.java.jdbc$db_do_commands$fn__2331.invoke(jdbc.clj:671) 
    at clojure.java.jdbc$db_transaction_STAR_.doInvoke(jdbc.clj:580) 
    at clojure.lang.RestFn.invoke(RestFn.java:425) 
    at clojure.java.jdbc$db_do_commands.doInvoke(jdbc.clj:670) 
    at clojure.lang.RestFn.applyTo(RestFn.java:142) 
    at clojure.core$apply.invoke(core.clj:628) 
    at clojure.java.jdbc$db_do_commands.doInvoke(jdbc.clj:677) 
    at clojure.lang.RestFn.applyTo(RestFn.java:142) 
    at clojure.core$apply.invoke(core.clj:630) 
    at clojure.java.jdbc$db_do_commands.doInvoke(jdbc.clj:664) 
    at clojure.lang.RestFn.invoke(RestFn.java:425) 
    at app.storage$create_db.invoke(storage.clj:21) 
    at app.storage$eval2445.invoke(storage.clj:33) 
    at clojure.lang.Compiler.eval(Compiler.java:6703) 
    at clojure.lang.Compiler.load(Compiler.java:7130) 
    ... 76 more 
Subprocess failed 

답변

5

나는 문제가 catch 유형 ExceptionInfo의 예외를 잡기 위해 노력하고 있다고 생각합니다. 이를 Exception 또는 Throwable으로 변경하고 예외가 발생하는지 확인하십시오. 당신의 스택

(catch Exception e 

주의가 슬로우되는 예외의 유형 clojure.lang.ExceptionInfo에서 상속하지 않습니다 java.sql.BatchUpdateException입니다 추적. ExceptionInfo 예외는 일반적으로 ex-info, docs here을 호출하여 만들어집니다. catch은 지정된 유형 (또는 그 하위 유형)의 예외 만 catch합니다.

관련 문제