programing

루비에서 예외를 높이는 것과 예외를 던지는 것의 차이점은 무엇입니까?

instargram 2023. 6. 1. 22:12
반응형

루비에서 예외를 높이는 것과 예외를 던지는 것의 차이점은 무엇입니까?

Ruby에는 두 가지 예외 메커니즘이 있습니다.던지고/잡아 올리고/구원합니다.

왜 두 개야?

당신은 언제 하나를 사용해야 하고 다른 하나는 사용하지 말아야 합니까?

  • raise,fail,rescue,그리고.ensure예외라고도 하는 오류 처리
  • throw그리고.catch제어 흐름

다른 언어와 달리 루비의 던지기와 잡기는 예외적으로 사용되지 않습니다.대신, 더 이상의 작업이 필요하지 않을 때 실행을 조기에 종료할 수 있는 방법을 제공합니다. (그림, 2011)

단일 수준의 제어 흐름 종료(예:while루프, 간단한 작업으로 수행할 수 있습니다.return중첩된 루프와 같이 여러 수준의 제어 흐름을 종료할 수 있습니다.throw.

상승 및 구조의 예외 메커니즘은 상황이 잘못될 때 실행을 포기하는 데 유용하지만, 일반적인 처리 중에 깊이 중첩된 구조에서 뛰어내릴 수 있는 것도 좋습니다.이것이 캐치볼과 던지기가 유용한 곳입니다. (토마스와 헌트, 2001)

레퍼런스

  1. 그림, 아브디"던지고, 잡고, 올리고, 구조하고…정말 혼란스럽습니다!"루비 학습 블로그.2011년 7월 11일 N.p.웹. 2012년 1월 1일http://rubylearning.com/blog/2011/07/12/throw-catch-raise-rescue--im-so-confused/ .
  2. 토마스, 데이브, 앤드루 헌트."프로그래밍 루비" : 실용주의 프로그래머 가이드, 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 제가 개선할 수 있을지 의심스러운 훌륭한 설명을 제공합니다.요약하자면, 블로그 게시물에서 코드 샘플을 삭제하는 것입니다.

  1. raise/rescue에 가장 가까운 유사체입니다.throw/catch다른 언어(또는 파이썬에 익숙한 구성)raise/except) 오류 조건이 발생하여 발생한 경우throw위에 로 다른언로어, 당은그극합야니다복해것을신합▁over다니▁should.raise루비로.

  2. 루비의.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

반응형