루비에서 예외를 높이는 것과 예외를 던지는 것의 차이점은 무엇입니까?
Ruby에는 두 가지 예외 메커니즘이 있습니다.던지고/잡아 올리고/구원합니다.
왜 두 개야?
당신은 언제 하나를 사용해야 하고 다른 하나는 사용하지 말아야 합니까?
raise
,fail
,rescue
,그리고.ensure
예외라고도 하는 오류 처리throw
그리고.catch
제어 흐름
다른 언어와 달리 루비의 던지기와 잡기는 예외적으로 사용되지 않습니다.대신, 더 이상의 작업이 필요하지 않을 때 실행을 조기에 종료할 수 있는 방법을 제공합니다. (그림, 2011)
단일 수준의 제어 흐름 종료(예:while
루프, 간단한 작업으로 수행할 수 있습니다.return
중첩된 루프와 같이 여러 수준의 제어 흐름을 종료할 수 있습니다.throw
.
상승 및 구조의 예외 메커니즘은 상황이 잘못될 때 실행을 포기하는 데 유용하지만, 일반적인 처리 중에 깊이 중첩된 구조에서 뛰어내릴 수 있는 것도 좋습니다.이것이 캐치볼과 던지기가 유용한 곳입니다. (토마스와 헌트, 2001)
레퍼런스
- 그림, 아브디"던지고, 잡고, 올리고, 구조하고…정말 혼란스럽습니다!"루비 학습 블로그.2011년 7월 11일 N.p.웹. 2012년 1월 1일http://rubylearning.com/blog/2011/07/12/throw-catch-raise-rescue--im-so-confused/ .
- 토마스, 데이브, 앤드루 헌트."프로그래밍 루비" : 실용주의 프로그래머 가이드, N.p., 2001.웹. 2015년 9월 29일http://ruby-doc.com/docs/ProgrammingRuby/html/tut_exceptions.html .
저는 http://hasno.info/ruby-gotchas-and-caveats 이 그 차이에 대한 적절한 설명을 가지고 있다고 생각합니다.
캐치/디딤돌은 상승/구난과 다릅니다.catch/throw를 사용하면 블록을 빠르게 종료하여 특정 기호에 대한 catch가 정의된 지점으로 돌아갈 수 있습니다. raise rescue는 Exception 개체와 관련된 실제 예외 처리 항목입니다.
https://coderwall.com/p/lhkkug/don-t-confuse-ruby-s-throw-statement-with-raise 은 제가 개선할 수 있을지 의심스러운 훌륭한 설명을 제공합니다.요약하자면, 블로그 게시물에서 코드 샘플을 삭제하는 것입니다.
raise
/rescue
에 가장 가까운 유사체입니다.throw
/catch
다른 언어(또는 파이썬에 익숙한 구성)raise
/except
) 오류 조건이 발생하여 발생한 경우throw
위에 로 다른언로어, 당은그극합야니다복해것을신합▁over다니▁should.raise
루비로.루비의.
throw
/catch
실을행중다찾수을있다습니음을올라를 찾을 수 .catch
요)raise
/rescue
하지만 실제로는 오류 조건을 위한 것은 아닙니다.이것은 드물게 사용되어야 하며, "해당하는 것을 찾을 때까지 스택을 걸어 올라가라"는 경우에만 사용됩니다.catch
행동은 당신이 쓰고 있는 알고리즘에 대해 말이 되지만, 그것을 생각하는 것은 말이 되지 않을 것입니다.throw
오류 조건에 해당합니다.Ruby에서 캐치 앤드 스로우는 무엇에 사용됩니까? 좋은 사용법에 대한 몇 가지 제안을 제공합니다.
throw
/catch
건설하다.
이들 사이의 구체적인 행동 차이는 다음과 같습니다.
rescue Foo
합니다.Foo
클스포의 하위Foo
.catch(foo)
같은 물체만 잡을 것입니다. 당신은 통과할 수 없을 뿐만 아니라catch
클래스 이름을 사용하여 인스턴스를 캡처하지만 동등한 비교도 수행하지 않습니다.를 들면, .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
사람이 동시에
catch
합니다...es는 nested여야 합니다...catch :foo do catch :bar do do_something_that_can_throw_foo_or_bar end end
베어.
rescue
는 와동합다니등다에 합니다.rescue StandardError
관용적인 구문입니다.A "베어"catch
마음에catch() {throw :foo}
절대 아무것도 잡지 않을 것이고 사용되어서는 안 됩니다.
언급URL : https://stackoverflow.com/questions/51021/what-is-the-difference-between-raising-exceptions-vs-throwing-exceptions-in-ruby
'programing' 카테고리의 다른 글
SQL Server 2008에서 루프하는 동안 작업 (0) | 2023.06.01 |
---|---|
VB.net 숫자만 허용하려면 텍스트 상자 필요 (0) | 2023.06.01 |
장고 관리자의 필드 크기 조정 (0) | 2023.05.27 |
VBA의 범위에서 어레이 생성 (0) | 2023.05.27 |
Azure 리소스 그룹의 이름을 변경하려면 어떻게 해야 합니까? (0) | 2023.05.27 |