try
, एक दूसरे से एक है कि पहले से पुकारा जाता है में catch
एक मैक्रो में है। काम करने के लिए निम्नलिखित कैसे प्राप्त करें?विभिन्न (लेकिन नेस्टेड) मैक्रोज़ में कोशिश कर सकते हैं और पकड़ सकते हैं?
(defmacro catch-me []
`(catch ~'Exception ~'ex
true))
(defmacro try-me []
`(try (+ 4 3)
(catch-me)))
विस्तार try-me
अच्छा लग रहा है:
(clojure.walk/macroexpand-all '(try-me))
पैदावार
(try (clojure.core/+ 4 3) (catch Exception ex true))
लेकिन बुला (कोशिश-मुझे) पैदावार:
"Unable to resolve symbol: catch in this context",
जो, Btw, भी है संदेश आपको आरपीएल में मिलेगा प्रयास में नहीं होने पर पकड़ का उपयोग करते समय।
अद्यतन:
यह मैं इसे कैसे काम करने के लिए (धन्यवाद, @Barmar) प्राप्त कर सकते है, यहाँ आप मेरी कोड के वास्तविक संदर्भ देख सकते हैं:
(defmacro try-me [& body]
`(try
[email protected]
[email protected](for [[e msg] [[com.mongodb.MongoException$Network "Database unreachable."]
[com.mongodb.MongoException "Database problem."]
[Exception "Unknown error."]]]
`(catch ~e ~'ex
(common/site-layout
[:div {:id "errormessage"}
[:p ~msg]
[:p "Error is: " ~e]
[:p "Message is " ~'ex]])))))
लेकिन यह मैं क्या था (एक अलग मैक्रो का उपयोग catch-me
) के लिए उम्मीद:
(defmacro try-me [& body]
`(try
[email protected]
(catch-me com.mongodb.MongoException$Network "Database unreachable.")
(catch-me com.mongodb.MongoException "Database problem.")
(catch-me Exception "Unknown error.")))
मुझे लगता है कि यह आसान हो लिखने/बनाए रखने के लिए होगा।
कोई भी विचार? मैं वाक्य रचना-के हवाले से की जरूरत है क्योंकि मैं पैरामीटर प्रदान करने कर रहा हूँ, यही कारण है कि दुर्भाग्य से आर्थर की जवाब लागू नहीं किया जा सकता है (कर सकते हैं किसी भी तरह या यह?) है, लेकिन मैं अभी तक मेरे वास्तविक संदर्भ पोस्ट नहीं किया था।
मेरे वर्तमान अनुमान है कि (पकड़ने-मुझे) इससे पहले कि यह स्पष्ट हो कि यह एक कोशिश के अंदर है, पहले विस्तारित किया गया है। क्या यही है? उससे लड़ने के लिए कैसे? – 0dB
मैक्रोज़ केवल उन स्थानों पर विस्तारित किए जाते हैं जहां एक अभिव्यक्ति का मूल्यांकन सामान्य रूप से किया जाएगा। 'पकड़' उप-अभिव्यक्ति अभिव्यक्ति नहीं होती है जिसका मूल्यांकन किया जाता है, वे 'try' के वाक्यविन्यास का हिस्सा हैं। – Barmar
मैं वर्तमान में अभी भी इस प्रश्न को अनुत्तरित मानता हूं। यह परेशान है कि आर्थर का उदाहरण क्यों काम करता है लेकिन सिंटैक्स उद्धरण का उपयोग करने वाला कोई नहीं करता है, और, यह मैक्रोएक्सपैंड-सब एक काम कर रहे मैक्रो विस्तार को दिखाता है लेकिन इसके लिए एक सीधी कॉल एक त्रुटि के साथ विफल रहता है। कामकाज के लिए बाड़ार के लिए धन्यवाद। कोई अन्य विचार, कोई भी? – 0dB