2013-12-20 6 views
6

Ich versuche, eine Exception-Handler für wenn clj-http kehrt 404. Nach dem Abschnitt Ausnahmen im documentation zu schreiben:versuchen und Schleuder/Versuch + Unterschiede?

CLJ-http wird eine Schleuder Stein werfen, die durch eine regelmäßige (abgefangen werden kann Exception e ...) oder in Schleuder der Versuch + Block

dieser Versuch, es sieht aus wie es einige Unterschiede gibt, dass ich Schwierigkeiten haben, herauszufinden:

(ns my-app.core 
    (:require [clj-http.client :as client]) 
    (:use [slingshot.slingshot])) 

(try 
    (client/get "http://some-site.com/broken") 
    (catch Exception e (print "I found a problem!"))) 

=> I found a problem! 
    nil 

(try+ 
    (client/get "http://some-site.com/broken") 
    (catch Exception e (print "I found a problem!"))) 

=> ExceptionInfo clj-http: status 404 clj-http.client/wrap-exceptions/fn--1604 (client.clj:147) 

Antwort

10

Wenn Sie nicht filtern für Subklassen von Exception, die gut funktioniert:

(try+ 
    (client/get "http://some-site.com/broken") 
    (catch Object _ (print "I found a problem!"))) 

Das Ding hier geworfen ist eine native Clojure Karte mit Ausnahme von Metadaten, nicht traditioneller Java-Ausnahme als solche.

Wenn Sie also Slingshot verwenden, können Sie auf dieser Karte filtern - mit Feldern wie Anforderungsstatus, zurückgegebenen Inhalt, Weiterleitungen usw. -, um außer Blöcken mit einer viel feinkörnigeren Auswahl als nur zu haben die Klasse. Zum Beispiel:

(try+ 
    (client/get "http://some-site.com/broken") 
    (catch [:status 404] {:keys [trace-redirects]} 
    (print "No longer exists! (redirected through " trace-redirects ")"))) 
Verwandte Themen