Yanıtlar:
Kullanabileceğimiz birkaç seçenek var.
İşlevden çıkmak için catch/ throwdüğmelerine basabilirsiniz .
misal:
(defun my-func ()
"thrown error"
(catch 'my-catch
(when t
(throw 'my-catch "always going to throw"))
(+ 42 1)))
Ayrıca kullanabilir blockve return-from(size gereken etmek gerekir ancak cl-macs)
misal:
(require 'cl-macs)
(defun my-func ()
"block / return-from"
(block my-func
(when t
(return-from my-func))
(+ 42 1)))
Ayrıca , işlevle aynı ada cl-defunsahip bir örtük blockvar, böylece blockstili daha az ile yapabiliriz .
misal:
(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-defunayrıca defun*şu şekilde tanımlanan bir takma ad olarak da kullanılabilir 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'ın kapsadığına ek olarak, sadece bir hata oluşturun.
Bu, kod, ignore-errorsveya gibi hata işleme yapılarının kapsamı içinde (dinamik olarak, sözcük olarak değil) çağrıldığında yardımcı olmaz condition-case, ancak aksi takdirde bir işlevden çıkmak için iyi bir yoldur. Aslında çoğu zaman yapılan budur.
(defun my-func ()
"..."
(unless something (error "Whoops!"))
; continue as usual...
(+ 42 1))
Hatayı kendiniz ele almak istiyorsanız, arama kodunu (örneğin, nihayetinde çağıran my-funcbir şeye çağrı ) a condition-case. Yine, çoğu zaman, en az catch+ kullanmak kadar sık yapılan budur throw. Her şey istediğiniz davranışa bağlıdır.
catch, unwind-protect, condition-caseve benzeri yararlıdır. Elisp kılavuzunun yerel olmayan çıkışlara ayrılmış bir bölümü vardır . (Ve hiçbiri hakkında özellikle kludgy yok, IMO.)
catch/throwyakalama / atma açısından diğer yaklaşımlar uygulandığından, elisp'de / daha deyimseldir. Elisp manuel diyor: "Common Lisp dahil Lisp çoğu başka sürümleri, sırasız denetim transferini birkaç yolu vardır:return,return-from, vego. Örneğin, Emacs Lisp sadece sahiptirthrow."