Jawaban:
Kami memiliki sejumlah opsi yang tersedia.
Anda dapat catch
/ throw
untuk keluar dari fungsi.
contoh:
(defun my-func ()
"thrown error"
(catch 'my-catch
(when t
(throw 'my-catch "always going to throw"))
(+ 42 1)))
Anda juga dapat menggunakan block
dan return-from
(meskipun Anda harus meminta cl-macs
)
contoh:
(require 'cl-macs)
(defun my-func ()
"block / return-from"
(block my-func
(when t
(return-from my-func))
(+ 42 1)))
Kami juga memiliki cl-defun
yang memiliki implisit block
dengan nama yang sama dengan fungsi, sehingga kami dapat melakukan block
gaya dengan lebih sedikit.
contoh:
(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
juga tersedia sebagai alias defun*
yang didefinisikan sebagai cl.el
:
(require 'cl)
(defun* my-func ()
"defun* implicit block"
(when t
(return-from my-func)) ; my-func is an implicit block.
(+ 42 1)))
Selain apa yang dicakup @EmacsFodder, cukup ajukan kesalahan.
Ini tidak akan membantu jika kode dipanggil di dalam (secara dinamis, bukan secara leksikal) sejauh mana konstruksi penanganan kesalahan seperti ignore-errors
atau condition-case
, tetapi sebaliknya itu adalah cara yang baik untuk keluar dari suatu fungsi. Sebenarnya apa yang dilakukan sebagian besar waktu.
(defun my-func ()
"..."
(unless something (error "Whoops!"))
; continue as usual...
(+ 42 1))
Jika Anda ingin menangani sendiri kesalahannya maka Anda dapat memasukkan kode panggilan (mis. Panggilan ke sesuatu yang memanggil secara berlebihan my-func
) di dalam a condition-case
. Sekali lagi, inilah yang paling sering dilakukan, paling tidak sesering menggunakan catch
+ throw
. Itu semua tergantung pada perilaku apa yang Anda inginkan.
catch
, unwind-protect
, condition-case
dan sejenisnya yang berguna. Ada seluruh bagian dari manual Elisp yang dikhususkan untuk keluar nonlokal . (Dan tidak ada yang khusus tentang mereka, IMO.)
catch
/throw
itu lebih idiomatis di elisp, karena pendekatan lain pada akhirnya diimplementasikan dalam hal menangkap / melempar. Manual elisp mengatakan: "Kebanyakan versi lain dari Lisp, termasuk Common Lisp, memiliki beberapa cara untuk mentransfer kontrol nonsequentially:return
,return-from
, dango
., Misalnya Emacs Lisp hanya memilikithrow
."