Я изучаю Clojure и хочу создать макрос, который работает как try-catch в Java. Если выброшено исключение, оно должно быть возвращено. В противном случае должен быть возвращен результат. Любой открытый ресурс также должен быть закрыт в разделе finally (без использования with-open). Однако у меня есть одна проблема, кроме того, что меня не поймают, и я не знаю, как ее решить. Любая помощь или предложение будут оценены!
Вот мой код:
(defmacro my-try
([expression]
`(try
~expression
(catch Exception e# e#)
)
)
([[value variable] expression]
`(let [~value ~variable]
(try
~expression
(catch Exception e# e#)
(finally (if (instance? java.io.Closeable ~value) (.close ~value)))
)
)
)
)
Когда я пытаюсь открыть и прочитать несуществующий файл:
(def v (my-try [s (FileReader. (File. "missing-file"))] (. s read)))
(println v)
Я получаю следующую ошибку:
Execution error (FileNotFoundException) at java.io.FileInputStream/open0 (FileInputStream.java:-2).
missing-file (Det går inte att hitta filen)
Я подозреваю, что это сообщение об ошибке является неперехваченным исключением, потому что (1) оно не соответствует структуре других исключений и (2) если я изменю формат возврата исключения, например добавлю конкретное сообщение, сообщение об ошибке все равно будет не изменить.
Любая помощь в поиске неисправности приветствуется! Большое спасибо за рассмотрение моей просьбы.