Yanıtlar:
Kullanabileceğimiz birkaç seçenek var.
İşlevden çıkmak için catch
/ throw
düğ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 block
ve 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-defun
sahip bir örtük block
var, böylece block
stili 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-defun
ayrı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-errors
veya 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-func
bir ş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-case
ve 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
/throw
yakalama / 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
."