जवाबों:
हमारे पास कई विकल्प उपलब्ध हैं।
आप कर सकते हैं catch
/ throw
समारोह बाहर निकलने के लिए।
उदाहरण:
(defun my-func ()
"thrown error"
(catch 'my-catch
(when t
(throw 'my-catch "always going to throw"))
(+ 42 1)))
आप भी उपयोग कर सकते हैं block
और return-from
(हालांकि आपको आवश्यकता होगी cl-macs
)
उदाहरण:
(require 'cl-macs)
(defun my-func ()
"block / return-from"
(block my-func
(when t
(return-from my-func))
(+ 42 1)))
हमारे पास फ़ंक्शन के समान नाम के साथ cl-defun
एक निहितार्थ भी है block
, इसलिए हम block
शैली को कम के साथ कर सकते हैं ।
उदाहरण:
(require 'cl-macs)
(cl-defun my-func ()
"cl-defun implicit block"
(when t
(return-from my-func)) ; my-func is an implicit block.
(+ 42 1)))
cl-defun
यह उर्फ के रूप में भी उपलब्ध है defun*
जो इस प्रकार परिभाषित है cl.el
:
(require 'cl)
(defun* my-func ()
"defun* implicit block"
(when t
(return-from my-func)) ; my-func is an implicit block.
(+ 42 1)))
@EmacsFodder को कवर करने के अलावा, बस एक त्रुटि बढ़ाएं।
यह मदद नहीं करेगा यदि कोड (गतिशील रूप से, शाब्दिक रूप से नहीं) को त्रुटि-हैंडलिंग निर्माणों की सीमा के भीतर ignore-errors
या जैसे कहा जाता है condition-case
, लेकिन अन्यथा यह एक फ़ंक्शन से बाहर निकलने का एक अच्छा तरीका है। यह वास्तव में है कि ज्यादातर समय क्या किया जाता है।
(defun my-func ()
"..."
(unless something (error "Whoops!"))
; continue as usual...
(+ 42 1))
यदि आप स्वयं त्रुटि को संभालना चाहते हैं, तो आप कॉलिंग कोड (जैसे किसी चीज़ को कॉल करने के लिए, जिसे कॉल करके कॉल कर सकते हैं my-func
) को अंदर डाल सकते हैं condition-case
। फिर, यह वही है जो ज्यादातर समय किया जाता है, कम से कम जितनी बार catch
+ का उपयोग किया जाता है throw
। यह सब इस बात पर निर्भर करता है कि आप क्या व्यवहार चाहते हैं।
catch
, unwind-protect
, condition-case
और की तरह उपयोगी होते हैं। नॉनोकॉक निकास के लिए समर्पित एलिसा मैनुअल का एक पूरा खंड है । (और उनमें से किसी के बारे में विशेष रूप से कुछ भी गलत नहीं है, IMO।)
catch
/throw
तो एलीस्प में अधिक मुहावरेदार है, क्योंकि अन्य दृष्टिकोण अंततः कैच / थ्रो के संदर्भ में लागू होते हैं। Elisp मैनुअल कहते हैं: "लिस्प के अधिकांश अन्य संस्करणों, आम लिस्प सहित nonsequentially नियंत्रण के हस्तांतरण के कई तरीके होते हैं:return
,return-from
, औरgo
। उदाहरण के लिए, Emacs लिस्प केवलthrow
।"