अपवादों को छोड़ने से पहले मैं कई बार एक func निष्पादित करने की कोशिश कर रहा हूं। लेकिन क्लोजर में कैच ब्लॉक से पुनरावृत्ति करने के लिए यह वैध नहीं है। यह कैसे प्राप्त किया जा सकता है?क्लोजर: अपवाद पर पुनरावृत्ति कैसे करें?
(loop [tries 10]
(try
(might-throw-exception)
(catch Exception e
(when (pos? tries) (recur (dec tries))))))
java.lang.UnsupportedOperationException: Cannot recur from catch/finally
सबसे अच्छा मैं मिल सकता है
निम्नलिखित अनाड़ी समाधान (समारोह में लपेटकर और यह बुला)
(defn do-it []
(try
(might-throw-exception)
(catch Exception e nil)))
(loop [times 10]
(when (and (nil? (do-it)) (pos? times))
(recur (dec times))))
यह वह जगह है एक अच्छा समाधान। मैं इसे clojure.contrib या कुछ में जोड़ दूंगा। – GabiMe
वास्तव में वही समाधान है जैसा कि पोस्टर ने सुझाव दिया था। लेकिन मैक्रोज़ सामान्य मामले में करना आसान बनाता है। मैक्रोज़ किसी भी लिस्पी संस्करण की हत्यारा सुविधा है। –
यह बिल्कुल वही समाधान नहीं है। पोस्टर का सुझाव ब्लॉक के रिटर्न वैल्यू को नहीं पकड़ता है, और अगर ऐसा होता है तो ब्लॉक शून्य वापस नहीं कर पाएगा। इसके अलावा अपवाद निगल गए हैं। लेकिन आप सही हैं: यह मूल रूप से एक ही विचार है। मैक्रोज़ बस बॉयलरप्लेट को छुपाएं। – kotarak