답변:
다양한 옵션이 있습니다.
당신은 수 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
or 와 같은 오류 처리 구문의 범위 내에서 (동적으로, 어휘 적으로) 호출되지 않으면 도움이되지 condition-case
않지만 그렇지 않으면 함수를 종료하는 좋은 방법입니다. 실제로 대부분의 시간이 수행됩니다.
(defun my-func ()
"..."
(unless something (error "Whoops!"))
; continue as usual...
(+ 42 1))
오류를 직접 처리하려면 호출 코드 (예 : 울리게 호출하는 것에 대한 호출 my-func
)를 안에 넣을 수 있습니다 condition-case
. 다시 말하지만, 이것은 적어도 catch
+ 를 사용하는 것만 큼 자주 수행됩니다 throw
. 그것은 당신이 원하는 행동에 달려 있습니다.
catch
/throw
는 더 관용적입니다. elisp 매뉴얼은 말한다 : "CL의 포함 리스프의 대부분의 다른 버전, 비 순차적으로 제어를 전송하는 여러 가지 방법이 있습니다return
,return-from
하고go
. 예를 들어, 이맥스 리스프는있다throw
."