Jawaban:
Kami memiliki sejumlah opsi yang tersedia.
Anda dapat catch/ throwuntuk 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 blockdan 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-defunyang memiliki implisit blockdengan nama yang sama dengan fungsi, sehingga kami dapat melakukan blockgaya 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-defunjuga 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-errorsatau 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-casedan sejenisnya yang berguna. Ada seluruh bagian dari manual Elisp yang dikhususkan untuk keluar nonlokal . (Dan tidak ada yang khusus tentang mereka, IMO.)
catch/throwitu 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."