идиоматический способ перехвата исключений в кольцевых приложениях

Каков идиоматический способ обработки исключений в кольцевых приложениях. Я хотел бы зафиксировать исключение и вернуть 500 страниц. Как я могу это сделать ?

Я использую усы для кода ниже, однако это не работает -

(def my-app (try
              (app
               (wrap-logger true)
               wrap-keyword-params
               wrap-params
               wrap-file-info
               (wrap-file "resources/public/")
               [""]  (index-route @prev-h nil)
               ["getContent"] (fetch-url)
               ["about"] "We are freaking cool man !!"
               [&] (-> "Nothing was found" response (status 404) constantly))
              (catch Exception e
                (app
                 [&] (-> "This is an error" response (status 500) constantly)))

person murtaza52    schedule 27.09.2012    source источник


Ответы (1)


Вы не хотите оборачивать все приложение в блок try-catch, вы хотите обернуть обработку каждого запроса отдельно. Довольно легко сделать промежуточное программное обеспечение, которое делает это. Что-то типа:

(defn wrap-exception [handler]
  (fn [request]
    (try (handler request)
      (catch Exception e
         {:status 500
          :body "Exception caught"}))))
person Joost Diepenmaat    schedule 27.09.2012
comment
Спасибо, я думал о том же и буду использовать ваш пример, но почему мой пример все еще не работает? - person murtaza52; 28.09.2012
comment
В вашем примере перехватываются только те исключения, которые возникают при создании экземпляра приложения. Когда приложение привязано к my-app, выражение try-catch уже завершено. - person Joost Diepenmaat; 28.09.2012