답변:
http://hasno.info/ruby-gotchas-and-caveats 는 그 차이점에 대한 적절한 설명이 있다고 생각 합니다.
캐치 / 투척은 레이즈 / 레스큐와 다릅니다. catch / throw를 사용하면 특정 기호에 대해 catch가 정의 된 지점으로 블록을 신속하게 종료 할 수 있습니다. 구조 상승은 Exception 객체와 관련된 실제 예외 처리 작업입니다.
raise매우 비쌉니다. throw아니다. 루프에서 벗어나기 위해 throw사용 goto하는 것으로 생각하십시오 .
raise, fail, rescue, 및 ensure핸들 오류 라고도 예외throw하고 catch있는 제어 흐름다른 언어와 달리 Ruby의 throw and catch는 예외에 사용되지 않습니다. 대신 추가 작업이 필요하지 않을 때 실행을 조기에 종료 할 수있는 방법을 제공합니다. (2011 년 그림)
while루프 처럼 단일 레벨의 제어 흐름을 종료하는 것은 간단한 방법으로 수행 할 수 있습니다 return. 중첩 루프와 같이 여러 수준의 제어 흐름을 종료하면을 (를) 수행 할 수 있습니다 throw.
발생 및 구조의 예외 메커니즘은 문제가 발생했을 때 실행을 포기하는 데 유용하지만 정상적인 처리 중에 깊게 중첩 된 구성에서 벗어날 수있는 것이 좋습니다. 여기에 잡기와 던지기가 편리합니다. <토마스 앤 헌트> (2001)
https://coderwall.com/p/lhkkug/don-t-confuse-ruby-s-throw-statement-with-raise 는 내가 향상시킬 수없는 의심스러운 훌륭한 설명을 제공합니다. 요약하면 블로그 게시물에서 일부 코드 샘플을 닉킹합니다.
raise/ rescue는 다른 언어 (또는 Python의 / ) 와 친숙한 throw/ catch구문 과 가장 유사한 아날로그 입니다. 오류 상태가 발생하여 다른 언어로 처리 한 경우 Ruby로 해야합니다 .raiseexceptthrowraise
Ruby의 throw/를 catch사용하면 실행을 중단하고 스택 catch과 같이 (처럼 raise/ 처럼 rescue)를 찾을 수 있지만 실제로는 오류 조건을 의미하지는 않습니다. 거의 사용하지 않아야하며, "대응하는 catch동작 을 찾을 때까지 스택을 따라 가십시오 "동작이 작성중인 알고리즘에는 의미가 있지만 throw오류에 해당하는 것으로 생각하는 것은 이치에 맞지 않습니다. 질환.
Ruby에서 catch와 throw는 무엇입니까? throw/ catch구문 의 훌륭한 사용법에 대한 제안을 제공합니다 .
그들 사이의 구체적인 행동 차이는 다음과 같습니다.
rescue FooFoo하위 클래스를 포함하는 인스턴스를 구출합니다 Foo. 같은 객체catch(foo) 만 잡습니다 . 클래스 이름을 전달 하여 인스턴스를 포착 할 수있을뿐만 아니라 동등 비교도 수행하지 않습니다. 예를 들어Foocatch
catch("foo") do
throw "foo"
end
당신에게 줄 것이다 UncaughtThrowError: uncaught throw "foo"(또는 ArgumentError루비의 이전 버전에서 2.2을)
여러 구조 조항을 나열 할 수 있습니다 ...
begin
do_something_error_prone
rescue AParticularKindOfError
# Insert heroism here.
rescue
write_to_error_log
raise
end
여러 catches를 중첩해야 하지만 ...
catch :foo do
catch :bar do
do_something_that_can_throw_foo_or_bar
end
end
베어 (bare) rescue는 rescue StandardError관용적 구성과 동일 하며 관용적 구성입니다. catch와 같은 "베어 " catch() {throw :foo}는 아무 것도 잡을 수 없으므로 사용해서는 안됩니다.
goto에서 in 외에도 , Java는 break라고 레이블을 붙였다 . (Python도 이에 대한 제안 을 거부 했습니다.)